1 Introduction

Update of explore-JULES-ES-1p0.Rmd that uses the new packages and functions

We build and test gaussian process emulators, perform a sensitivity analyis, and constrain the input space of Jules.

Andy thinks there might be mileage in analysing the atmospheric growth, which is here. /home/h01/hadaw/Research/ES_PPE/Oct20

At the moment, this vignette is hampered by the fact that emulators are failing on a few of the outputs which represent change over the historical period. The emulator is fine for predicting absolute values in the modern period.

Andy would like to see timeseries of: cVeg, cSoil and nbp, npp in GtC and GtC/yr.

1.1 Preliminaries

Load libraries, functions and data.

# Load helper functions

knitr::opts_chunk$set(fig.path = "figs/", echo = FALSE, message = FALSE, warnings = FALSE)
# load some helper functions
source('~/brazilCSSP/code/brazil_cssp/per_pft.R') # eventually, move the relevant functions
source('explore-JULES-ES-1p0_PPE_functions.R')

1.2 Carbon budget data

Section 2.5 in Friedlingstein et al. describes how the land carbon sink is estimated.

1.2.1 Jules output data location

1.3 Extract a time series of an annual, globally aggregated variable

1.4 Plot timeseries of aggregated global timeseries

1.5 Can we understand change and absolute?

1.6 Function to extract the “modern value” direct from the file (last 20 years of the timeseries)

1.7 Loop to extract the “modern value” of a number of model outputs

1.8 Calculate an ensemble of anomalies for all variables

For each ensemble member and each variable, calculate the change from the 20 years at the start of the run, to the twenty years at the end of the run.

1.9 Clean data sets to “level 0”

Initial clean of data set, removing variables that don’t change, and removing NAs (models that didn’t run).

[1] TRUE

1.10 Where did the model fail to run?

(“probability of run failure” Could be an interesting project - logit transformation for probability of run failure? Some other ML like SVM?

There are clear run failure thresholds in the parameters rootd_ft_io and lai_max, and quite strong visual indications that a_wl_io and bio_hum_cn matter.

NEXT, histograms of failure with the LHS value

Error in R_nc4_open: No such file or directory
Error in nc_open(paste0(fn)) : 
  Error in nc_open trying to open file /project/carbon_ppe/JULES-ES-1p0_PPE/P0069/stats/JULES-ES-1p0_P0069_Annual_global.nc
Error in R_nc4_inq_varndims: NetCDF: Not a valid ID
Error in ncvar_ndims(ncid, varid) : error returned from C call
Error in R_nc4_close: NetCDF: Not a valid ID
Error in R_nc4_open: No such file or directory
Error in nc_open(paste0(fn)) : 
  Error in nc_open trying to open file /project/carbon_ppe/JULES-ES-1p0_PPE/P0086/stats/JULES-ES-1p0_P0086_Annual_global.nc
Error in R_nc4_inq_varndims: NetCDF: Not a valid ID
Error in ncvar_ndims(ncid, varid) : error returned from C call
Error in R_nc4_close: NetCDF: Not a valid ID
Error in R_nc4_open: No such file or directory
Error in nc_open(paste0(fn)) : 
  Error in nc_open trying to open file /project/carbon_ppe/JULES-ES-1p0_PPE/P0144/stats/JULES-ES-1p0_P0144_Annual_global.nc
Error in R_nc4_inq_varndims: NetCDF: Not a valid ID
Error in ncvar_ndims(ncid, varid) : error returned from C call
Error in R_nc4_close: NetCDF: Not a valid ID
Error in R_nc4_open: No such file or directory
Error in nc_open(paste0(fn)) : 
  Error in nc_open trying to open file /project/carbon_ppe/JULES-ES-1p0_PPE/P0165/stats/JULES-ES-1p0_P0165_Annual_global.nc
Error in R_nc4_inq_varndims: NetCDF: Not a valid ID
Error in ncvar_ndims(ncid, varid) : error returned from C call
Error in R_nc4_close: NetCDF: Not a valid ID
Error in R_nc4_open: No such file or directory
Error in nc_open(paste0(fn)) : 
  Error in nc_open trying to open file /project/carbon_ppe/JULES-ES-1p0_PPE/P0168/stats/JULES-ES-1p0_P0168_Annual_global.nc
Error in R_nc4_inq_varndims: NetCDF: Not a valid ID
Error in ncvar_ndims(ncid, varid) : error returned from C call
Error in R_nc4_close: NetCDF: Not a valid ID
Error in R_nc4_open: No such file or directory
Error in nc_open(paste0(fn)) : 
  Error in nc_open trying to open file /project/carbon_ppe/JULES-ES-1p0_PPE/P0183/stats/JULES-ES-1p0_P0183_Annual_global.nc
Error in R_nc4_inq_varndims: NetCDF: Not a valid ID
Error in ncvar_ndims(ncid, varid) : error returned from C call
Error in R_nc4_close: NetCDF: Not a valid ID
Error in R_nc4_open: No such file or directory
Error in nc_open(paste0(fn)) : 
  Error in nc_open trying to open file /project/carbon_ppe/JULES-ES-1p0_PPE/P0185/stats/JULES-ES-1p0_P0185_Annual_global.nc
Error in R_nc4_inq_varndims: NetCDF: Not a valid ID
Error in ncvar_ndims(ncid, varid) : error returned from C call
Error in R_nc4_close: NetCDF: Not a valid ID
Error in R_nc4_open: No such file or directory
Error in nc_open(paste0(fn)) : 
  Error in nc_open trying to open file /project/carbon_ppe/JULES-ES-1p0_PPE/P0214/stats/JULES-ES-1p0_P0214_Annual_global.nc
Error in R_nc4_inq_varndims: NetCDF: Not a valid ID
Error in ncvar_ndims(ncid, varid) : error returned from C call
Error in R_nc4_close: NetCDF: Not a valid ID
Error in R_nc4_open: No such file or directory
Error in nc_open(paste0(fn)) : 
  Error in nc_open trying to open file /project/carbon_ppe/JULES-ES-1p0_PPE/P0216/stats/JULES-ES-1p0_P0216_Annual_global.nc
Error in R_nc4_inq_varndims: NetCDF: Not a valid ID
Error in ncvar_ndims(ncid, varid) : error returned from C call
Error in R_nc4_close: NetCDF: Not a valid ID
Error in R_nc4_open: No such file or directory
Error in nc_open(paste0(fn)) : 
  Error in nc_open trying to open file /project/carbon_ppe/JULES-ES-1p0_PPE/P0235/stats/JULES-ES-1p0_P0235_Annual_global.nc
Error in R_nc4_inq_varndims: NetCDF: Not a valid ID
Error in ncvar_ndims(ncid, varid) : error returned from C call
Error in R_nc4_close: NetCDF: Not a valid ID
Error in R_nc4_open: No such file or directory
Error in nc_open(paste0(fn)) : 
  Error in nc_open trying to open file /project/carbon_ppe/JULES-ES-1p0_PPE/P0238/stats/JULES-ES-1p0_P0238_Annual_global.nc
Error in R_nc4_inq_varndims: NetCDF: Not a valid ID
Error in ncvar_ndims(ncid, varid) : error returned from C call
Error in R_nc4_close: NetCDF: Not a valid ID
Error in R_nc4_open: No such file or directory
Error in nc_open(paste0(fn)) : 
  Error in nc_open trying to open file /project/carbon_ppe/JULES-ES-1p0_PPE/P0251/stats/JULES-ES-1p0_P0251_Annual_global.nc
Error in R_nc4_inq_varndims: NetCDF: Not a valid ID
Error in ncvar_ndims(ncid, varid) : error returned from C call
Error in R_nc4_close: NetCDF: Not a valid ID
Error in R_nc4_open: No such file or directory
Error in nc_open(paste0(fn)) : 
  Error in nc_open trying to open file /project/carbon_ppe/JULES-ES-1p0_PPE/P0259/stats/JULES-ES-1p0_P0259_Annual_global.nc
Error in R_nc4_inq_varndims: NetCDF: Not a valid ID
Error in ncvar_ndims(ncid, varid) : error returned from C call
Error in R_nc4_close: NetCDF: Not a valid ID
Error in R_nc4_open: No such file or directory
Error in nc_open(paste0(fn)) : 
  Error in nc_open trying to open file /project/carbon_ppe/JULES-ES-1p0_PPE/P0285/stats/JULES-ES-1p0_P0285_Annual_global.nc
Error in R_nc4_inq_varndims: NetCDF: Not a valid ID
Error in ncvar_ndims(ncid, varid) : error returned from C call
Error in R_nc4_close: NetCDF: Not a valid ID
Error in R_nc4_open: No such file or directory
Error in nc_open(paste0(fn)) : 
  Error in nc_open trying to open file /project/carbon_ppe/JULES-ES-1p0_PPE/P0357/stats/JULES-ES-1p0_P0357_Annual_global.nc
Error in R_nc4_inq_varndims: NetCDF: Not a valid ID
Error in ncvar_ndims(ncid, varid) : error returned from C call
Error in R_nc4_close: NetCDF: Not a valid ID
Error in R_nc4_open: No such file or directory
Error in nc_open(paste0(fn)) : 
  Error in nc_open trying to open file /project/carbon_ppe/JULES-ES-1p0_PPE/P0376/stats/JULES-ES-1p0_P0376_Annual_global.nc
Error in R_nc4_inq_varndims: NetCDF: Not a valid ID
Error in ncvar_ndims(ncid, varid) : error returned from C call
Error in R_nc4_close: NetCDF: Not a valid ID
Error in R_nc4_open: No such file or directory
Error in nc_open(paste0(fn)) : 
  Error in nc_open trying to open file /project/carbon_ppe/JULES-ES-1p0_PPE/P0387/stats/JULES-ES-1p0_P0387_Annual_global.nc
Error in R_nc4_inq_varndims: NetCDF: Not a valid ID
Error in ncvar_ndims(ncid, varid) : error returned from C call
Error in R_nc4_close: NetCDF: Not a valid ID
Error in R_nc4_open: No such file or directory
Error in nc_open(paste0(fn)) : 
  Error in nc_open trying to open file /project/carbon_ppe/JULES-ES-1p0_PPE/P0394/stats/JULES-ES-1p0_P0394_Annual_global.nc
Error in R_nc4_inq_varndims: NetCDF: Not a valid ID
Error in ncvar_ndims(ncid, varid) : error returned from C call
Error in R_nc4_close: NetCDF: Not a valid ID
Error in R_nc4_open: No such file or directory
Error in nc_open(paste0(fn)) : 
  Error in nc_open trying to open file /project/carbon_ppe/JULES-ES-1p0_PPE/P0405/stats/JULES-ES-1p0_P0405_Annual_global.nc
Error in R_nc4_inq_varndims: NetCDF: Not a valid ID
Error in ncvar_ndims(ncid, varid) : error returned from C call
Error in R_nc4_close: NetCDF: Not a valid ID
Error in R_nc4_open: No such file or directory
Error in nc_open(paste0(fn)) : 
  Error in nc_open trying to open file /project/carbon_ppe/JULES-ES-1p0_PPE/P0424/stats/JULES-ES-1p0_P0424_Annual_global.nc
Error in R_nc4_inq_varndims: NetCDF: Not a valid ID
Error in ncvar_ndims(ncid, varid) : error returned from C call
Error in R_nc4_close: NetCDF: Not a valid ID
Error in R_nc4_open: No such file or directory
Error in nc_open(paste0(fn)) : 
  Error in nc_open trying to open file /project/carbon_ppe/JULES-ES-1p0_PPE/P0455/stats/JULES-ES-1p0_P0455_Annual_global.nc
Error in R_nc4_inq_varndims: NetCDF: Not a valid ID
Error in ncvar_ndims(ncid, varid) : error returned from C call
Error in R_nc4_close: NetCDF: Not a valid ID
Error in R_nc4_open: No such file or directory
Error in nc_open(paste0(fn)) : 
  Error in nc_open trying to open file /project/carbon_ppe/JULES-ES-1p0_PPE/P0457/stats/JULES-ES-1p0_P0457_Annual_global.nc
Error in R_nc4_inq_varndims: NetCDF: Not a valid ID
Error in ncvar_ndims(ncid, varid) : error returned from C call
Error in R_nc4_close: NetCDF: Not a valid ID
Error in R_nc4_open: No such file or directory
Error in nc_open(paste0(fn)) : 
  Error in nc_open trying to open file /project/carbon_ppe/JULES-ES-1p0_PPE/P0069/stats/JULES-ES-1p0_P0069_Annual_global.nc
Error in R_nc4_inq_varndims: NetCDF: Not a valid ID
Error in ncvar_ndims(ncid, varid) : error returned from C call
Error in R_nc4_close: NetCDF: Not a valid ID
Error in R_nc4_open: No such file or directory
Error in nc_open(paste0(fn)) : 
  Error in nc_open trying to open file /project/carbon_ppe/JULES-ES-1p0_PPE/P0086/stats/JULES-ES-1p0_P0086_Annual_global.nc
Error in R_nc4_inq_varndims: NetCDF: Not a valid ID
Error in ncvar_ndims(ncid, varid) : error returned from C call
Error in R_nc4_close: NetCDF: Not a valid ID
Error in R_nc4_open: No such file or directory
Error in nc_open(paste0(fn)) : 
  Error in nc_open trying to open file /project/carbon_ppe/JULES-ES-1p0_PPE/P0144/stats/JULES-ES-1p0_P0144_Annual_global.nc
Error in R_nc4_inq_varndims: NetCDF: Not a valid ID
Error in ncvar_ndims(ncid, varid) : error returned from C call
Error in R_nc4_close: NetCDF: Not a valid ID
Error in R_nc4_open: No such file or directory
Error in nc_open(paste0(fn)) : 
  Error in nc_open trying to open file /project/carbon_ppe/JULES-ES-1p0_PPE/P0165/stats/JULES-ES-1p0_P0165_Annual_global.nc
Error in R_nc4_inq_varndims: NetCDF: Not a valid ID
Error in ncvar_ndims(ncid, varid) : error returned from C call
Error in R_nc4_close: NetCDF: Not a valid ID
Error in R_nc4_open: No such file or directory
Error in nc_open(paste0(fn)) : 
  Error in nc_open trying to open file /project/carbon_ppe/JULES-ES-1p0_PPE/P0168/stats/JULES-ES-1p0_P0168_Annual_global.nc
Error in R_nc4_inq_varndims: NetCDF: Not a valid ID
Error in ncvar_ndims(ncid, varid) : error returned from C call
Error in R_nc4_close: NetCDF: Not a valid ID
Error in R_nc4_open: No such file or directory
Error in nc_open(paste0(fn)) : 
  Error in nc_open trying to open file /project/carbon_ppe/JULES-ES-1p0_PPE/P0183/stats/JULES-ES-1p0_P0183_Annual_global.nc
Error in R_nc4_inq_varndims: NetCDF: Not a valid ID
Error in ncvar_ndims(ncid, varid) : error returned from C call
Error in R_nc4_close: NetCDF: Not a valid ID
Error in R_nc4_open: No such file or directory
Error in nc_open(paste0(fn)) : 
  Error in nc_open trying to open file /project/carbon_ppe/JULES-ES-1p0_PPE/P0185/stats/JULES-ES-1p0_P0185_Annual_global.nc
Error in R_nc4_inq_varndims: NetCDF: Not a valid ID
Error in ncvar_ndims(ncid, varid) : error returned from C call
Error in R_nc4_close: NetCDF: Not a valid ID
Error in R_nc4_open: No such file or directory
Error in nc_open(paste0(fn)) : 
  Error in nc_open trying to open file /project/carbon_ppe/JULES-ES-1p0_PPE/P0214/stats/JULES-ES-1p0_P0214_Annual_global.nc
Error in R_nc4_inq_varndims: NetCDF: Not a valid ID
Error in ncvar_ndims(ncid, varid) : error returned from C call
Error in R_nc4_close: NetCDF: Not a valid ID
Error in R_nc4_open: No such file or directory
Error in nc_open(paste0(fn)) : 
  Error in nc_open trying to open file /project/carbon_ppe/JULES-ES-1p0_PPE/P0216/stats/JULES-ES-1p0_P0216_Annual_global.nc
Error in R_nc4_inq_varndims: NetCDF: Not a valid ID
Error in ncvar_ndims(ncid, varid) : error returned from C call
Error in R_nc4_close: NetCDF: Not a valid ID
Error in R_nc4_open: No such file or directory
Error in nc_open(paste0(fn)) : 
  Error in nc_open trying to open file /project/carbon_ppe/JULES-ES-1p0_PPE/P0235/stats/JULES-ES-1p0_P0235_Annual_global.nc
Error in R_nc4_inq_varndims: NetCDF: Not a valid ID
Error in ncvar_ndims(ncid, varid) : error returned from C call
Error in R_nc4_close: NetCDF: Not a valid ID
Error in R_nc4_open: No such file or directory
Error in nc_open(paste0(fn)) : 
  Error in nc_open trying to open file /project/carbon_ppe/JULES-ES-1p0_PPE/P0238/stats/JULES-ES-1p0_P0238_Annual_global.nc
Error in R_nc4_inq_varndims: NetCDF: Not a valid ID
Error in ncvar_ndims(ncid, varid) : error returned from C call
Error in R_nc4_close: NetCDF: Not a valid ID
Error in R_nc4_open: No such file or directory
Error in nc_open(paste0(fn)) : 
  Error in nc_open trying to open file /project/carbon_ppe/JULES-ES-1p0_PPE/P0251/stats/JULES-ES-1p0_P0251_Annual_global.nc
Error in R_nc4_inq_varndims: NetCDF: Not a valid ID
Error in ncvar_ndims(ncid, varid) : error returned from C call
Error in R_nc4_close: NetCDF: Not a valid ID
Error in R_nc4_open: No such file or directory
Error in nc_open(paste0(fn)) : 
  Error in nc_open trying to open file /project/carbon_ppe/JULES-ES-1p0_PPE/P0259/stats/JULES-ES-1p0_P0259_Annual_global.nc
Error in R_nc4_inq_varndims: NetCDF: Not a valid ID
Error in ncvar_ndims(ncid, varid) : error returned from C call
Error in R_nc4_close: NetCDF: Not a valid ID
Error in R_nc4_open: No such file or directory
Error in nc_open(paste0(fn)) : 
  Error in nc_open trying to open file /project/carbon_ppe/JULES-ES-1p0_PPE/P0285/stats/JULES-ES-1p0_P0285_Annual_global.nc
Error in R_nc4_inq_varndims: NetCDF: Not a valid ID
Error in ncvar_ndims(ncid, varid) : error returned from C call
Error in R_nc4_close: NetCDF: Not a valid ID
Error in R_nc4_open: No such file or directory
Error in nc_open(paste0(fn)) : 
  Error in nc_open trying to open file /project/carbon_ppe/JULES-ES-1p0_PPE/P0357/stats/JULES-ES-1p0_P0357_Annual_global.nc
Error in R_nc4_inq_varndims: NetCDF: Not a valid ID
Error in ncvar_ndims(ncid, varid) : error returned from C call
Error in R_nc4_close: NetCDF: Not a valid ID
Error in R_nc4_open: No such file or directory
Error in nc_open(paste0(fn)) : 
  Error in nc_open trying to open file /project/carbon_ppe/JULES-ES-1p0_PPE/P0376/stats/JULES-ES-1p0_P0376_Annual_global.nc
Error in R_nc4_inq_varndims: NetCDF: Not a valid ID
Error in ncvar_ndims(ncid, varid) : error returned from C call
Error in R_nc4_close: NetCDF: Not a valid ID
Error in R_nc4_open: No such file or directory
Error in nc_open(paste0(fn)) : 
  Error in nc_open trying to open file /project/carbon_ppe/JULES-ES-1p0_PPE/P0387/stats/JULES-ES-1p0_P0387_Annual_global.nc
Error in R_nc4_inq_varndims: NetCDF: Not a valid ID
Error in ncvar_ndims(ncid, varid) : error returned from C call
Error in R_nc4_close: NetCDF: Not a valid ID
Error in R_nc4_open: No such file or directory
Error in nc_open(paste0(fn)) : 
  Error in nc_open trying to open file /project/carbon_ppe/JULES-ES-1p0_PPE/P0394/stats/JULES-ES-1p0_P0394_Annual_global.nc
Error in R_nc4_inq_varndims: NetCDF: Not a valid ID
Error in ncvar_ndims(ncid, varid) : error returned from C call
Error in R_nc4_close: NetCDF: Not a valid ID
Error in R_nc4_open: No such file or directory
Error in nc_open(paste0(fn)) : 
  Error in nc_open trying to open file /project/carbon_ppe/JULES-ES-1p0_PPE/P0405/stats/JULES-ES-1p0_P0405_Annual_global.nc
Error in R_nc4_inq_varndims: NetCDF: Not a valid ID
Error in ncvar_ndims(ncid, varid) : error returned from C call
Error in R_nc4_close: NetCDF: Not a valid ID
Error in R_nc4_open: No such file or directory
Error in nc_open(paste0(fn)) : 
  Error in nc_open trying to open file /project/carbon_ppe/JULES-ES-1p0_PPE/P0424/stats/JULES-ES-1p0_P0424_Annual_global.nc
Error in R_nc4_inq_varndims: NetCDF: Not a valid ID
Error in ncvar_ndims(ncid, varid) : error returned from C call
Error in R_nc4_close: NetCDF: Not a valid ID
Error in R_nc4_open: No such file or directory
Error in nc_open(paste0(fn)) : 
  Error in nc_open trying to open file /project/carbon_ppe/JULES-ES-1p0_PPE/P0455/stats/JULES-ES-1p0_P0455_Annual_global.nc
Error in R_nc4_inq_varndims: NetCDF: Not a valid ID
Error in ncvar_ndims(ncid, varid) : error returned from C call
Error in R_nc4_close: NetCDF: Not a valid ID
Error in R_nc4_open: No such file or directory
Error in nc_open(paste0(fn)) : 
  Error in nc_open trying to open file /project/carbon_ppe/JULES-ES-1p0_PPE/P0457/stats/JULES-ES-1p0_P0457_Annual_global.nc
Error in R_nc4_inq_varndims: NetCDF: Not a valid ID
Error in ncvar_ndims(ncid, varid) : error returned from C call
Error in R_nc4_close: NetCDF: Not a valid ID
Error in R_nc4_open: No such file or directory
Error in nc_open(paste0(fn)) : 
  Error in nc_open trying to open file /project/carbon_ppe/JULES-ES-1p0_PPE/P0069/stats/JULES-ES-1p0_P0069_Annual_global.nc
Error in R_nc4_inq_varndims: NetCDF: Not a valid ID
Error in ncvar_ndims(ncid, varid) : error returned from C call
Error in R_nc4_close: NetCDF: Not a valid ID
Error in R_nc4_open: No such file or directory
Error in nc_open(paste0(fn)) : 
  Error in nc_open trying to open file /project/carbon_ppe/JULES-ES-1p0_PPE/P0086/stats/JULES-ES-1p0_P0086_Annual_global.nc
Error in R_nc4_inq_varndims: NetCDF: Not a valid ID
Error in ncvar_ndims(ncid, varid) : error returned from C call
Error in R_nc4_close: NetCDF: Not a valid ID
Error in R_nc4_open: No such file or directory
Error in nc_open(paste0(fn)) : 
  Error in nc_open trying to open file /project/carbon_ppe/JULES-ES-1p0_PPE/P0144/stats/JULES-ES-1p0_P0144_Annual_global.nc
Error in R_nc4_inq_varndims: NetCDF: Not a valid ID
Error in ncvar_ndims(ncid, varid) : error returned from C call
Error in R_nc4_close: NetCDF: Not a valid ID
Error in R_nc4_open: No such file or directory
Error in nc_open(paste0(fn)) : 
  Error in nc_open trying to open file /project/carbon_ppe/JULES-ES-1p0_PPE/P0165/stats/JULES-ES-1p0_P0165_Annual_global.nc
Error in R_nc4_inq_varndims: NetCDF: Not a valid ID
Error in ncvar_ndims(ncid, varid) : error returned from C call
Error in R_nc4_close: NetCDF: Not a valid ID
Error in R_nc4_open: No such file or directory
Error in nc_open(paste0(fn)) : 
  Error in nc_open trying to open file /project/carbon_ppe/JULES-ES-1p0_PPE/P0168/stats/JULES-ES-1p0_P0168_Annual_global.nc
Error in R_nc4_inq_varndims: NetCDF: Not a valid ID
Error in ncvar_ndims(ncid, varid) : error returned from C call
Error in R_nc4_close: NetCDF: Not a valid ID
Error in R_nc4_open: No such file or directory
Error in nc_open(paste0(fn)) : 
  Error in nc_open trying to open file /project/carbon_ppe/JULES-ES-1p0_PPE/P0183/stats/JULES-ES-1p0_P0183_Annual_global.nc
Error in R_nc4_inq_varndims: NetCDF: Not a valid ID
Error in ncvar_ndims(ncid, varid) : error returned from C call
Error in R_nc4_close: NetCDF: Not a valid ID
Error in R_nc4_open: No such file or directory
Error in nc_open(paste0(fn)) : 
  Error in nc_open trying to open file /project/carbon_ppe/JULES-ES-1p0_PPE/P0185/stats/JULES-ES-1p0_P0185_Annual_global.nc
Error in R_nc4_inq_varndims: NetCDF: Not a valid ID
Error in ncvar_ndims(ncid, varid) : error returned from C call
Error in R_nc4_close: NetCDF: Not a valid ID
Error in R_nc4_open: No such file or directory
Error in nc_open(paste0(fn)) : 
  Error in nc_open trying to open file /project/carbon_ppe/JULES-ES-1p0_PPE/P0214/stats/JULES-ES-1p0_P0214_Annual_global.nc
Error in R_nc4_inq_varndims: NetCDF: Not a valid ID
Error in ncvar_ndims(ncid, varid) : error returned from C call
Error in R_nc4_close: NetCDF: Not a valid ID
Error in R_nc4_open: No such file or directory
Error in nc_open(paste0(fn)) : 
  Error in nc_open trying to open file /project/carbon_ppe/JULES-ES-1p0_PPE/P0216/stats/JULES-ES-1p0_P0216_Annual_global.nc
Error in R_nc4_inq_varndims: NetCDF: Not a valid ID
Error in ncvar_ndims(ncid, varid) : error returned from C call
Error in R_nc4_close: NetCDF: Not a valid ID
Error in R_nc4_open: No such file or directory
Error in nc_open(paste0(fn)) : 
  Error in nc_open trying to open file /project/carbon_ppe/JULES-ES-1p0_PPE/P0235/stats/JULES-ES-1p0_P0235_Annual_global.nc
Error in R_nc4_inq_varndims: NetCDF: Not a valid ID
Error in ncvar_ndims(ncid, varid) : error returned from C call
Error in R_nc4_close: NetCDF: Not a valid ID
Error in R_nc4_open: No such file or directory
Error in nc_open(paste0(fn)) : 
  Error in nc_open trying to open file /project/carbon_ppe/JULES-ES-1p0_PPE/P0238/stats/JULES-ES-1p0_P0238_Annual_global.nc
Error in R_nc4_inq_varndims: NetCDF: Not a valid ID
Error in ncvar_ndims(ncid, varid) : error returned from C call
Error in R_nc4_close: NetCDF: Not a valid ID
Error in R_nc4_open: No such file or directory
Error in nc_open(paste0(fn)) : 
  Error in nc_open trying to open file /project/carbon_ppe/JULES-ES-1p0_PPE/P0251/stats/JULES-ES-1p0_P0251_Annual_global.nc
Error in R_nc4_inq_varndims: NetCDF: Not a valid ID
Error in ncvar_ndims(ncid, varid) : error returned from C call
Error in R_nc4_close: NetCDF: Not a valid ID
Error in R_nc4_open: No such file or directory
Error in nc_open(paste0(fn)) : 
  Error in nc_open trying to open file /project/carbon_ppe/JULES-ES-1p0_PPE/P0259/stats/JULES-ES-1p0_P0259_Annual_global.nc
Error in R_nc4_inq_varndims: NetCDF: Not a valid ID
Error in ncvar_ndims(ncid, varid) : error returned from C call
Error in R_nc4_close: NetCDF: Not a valid ID
Error in R_nc4_open: No such file or directory
Error in nc_open(paste0(fn)) : 
  Error in nc_open trying to open file /project/carbon_ppe/JULES-ES-1p0_PPE/P0285/stats/JULES-ES-1p0_P0285_Annual_global.nc
Error in R_nc4_inq_varndims: NetCDF: Not a valid ID
Error in ncvar_ndims(ncid, varid) : error returned from C call
Error in R_nc4_close: NetCDF: Not a valid ID
Error in R_nc4_open: No such file or directory
Error in nc_open(paste0(fn)) : 
  Error in nc_open trying to open file /project/carbon_ppe/JULES-ES-1p0_PPE/P0357/stats/JULES-ES-1p0_P0357_Annual_global.nc
Error in R_nc4_inq_varndims: NetCDF: Not a valid ID
Error in ncvar_ndims(ncid, varid) : error returned from C call
Error in R_nc4_close: NetCDF: Not a valid ID
Error in R_nc4_open: No such file or directory
Error in nc_open(paste0(fn)) : 
  Error in nc_open trying to open file /project/carbon_ppe/JULES-ES-1p0_PPE/P0376/stats/JULES-ES-1p0_P0376_Annual_global.nc
Error in R_nc4_inq_varndims: NetCDF: Not a valid ID
Error in ncvar_ndims(ncid, varid) : error returned from C call
Error in R_nc4_close: NetCDF: Not a valid ID
Error in R_nc4_open: No such file or directory
Error in nc_open(paste0(fn)) : 
  Error in nc_open trying to open file /project/carbon_ppe/JULES-ES-1p0_PPE/P0387/stats/JULES-ES-1p0_P0387_Annual_global.nc
Error in R_nc4_inq_varndims: NetCDF: Not a valid ID
Error in ncvar_ndims(ncid, varid) : error returned from C call
Error in R_nc4_close: NetCDF: Not a valid ID
Error in R_nc4_open: No such file or directory
Error in nc_open(paste0(fn)) : 
  Error in nc_open trying to open file /project/carbon_ppe/JULES-ES-1p0_PPE/P0394/stats/JULES-ES-1p0_P0394_Annual_global.nc
Error in R_nc4_inq_varndims: NetCDF: Not a valid ID
Error in ncvar_ndims(ncid, varid) : error returned from C call
Error in R_nc4_close: NetCDF: Not a valid ID
Error in R_nc4_open: No such file or directory
Error in nc_open(paste0(fn)) : 
  Error in nc_open trying to open file /project/carbon_ppe/JULES-ES-1p0_PPE/P0405/stats/JULES-ES-1p0_P0405_Annual_global.nc
Error in R_nc4_inq_varndims: NetCDF: Not a valid ID
Error in ncvar_ndims(ncid, varid) : error returned from C call
Error in R_nc4_close: NetCDF: Not a valid ID
Error in R_nc4_open: No such file or directory
Error in nc_open(paste0(fn)) : 
  Error in nc_open trying to open file /project/carbon_ppe/JULES-ES-1p0_PPE/P0424/stats/JULES-ES-1p0_P0424_Annual_global.nc
Error in R_nc4_inq_varndims: NetCDF: Not a valid ID
Error in ncvar_ndims(ncid, varid) : error returned from C call
Error in R_nc4_close: NetCDF: Not a valid ID
Error in R_nc4_open: No such file or directory
Error in nc_open(paste0(fn)) : 
  Error in nc_open trying to open file /project/carbon_ppe/JULES-ES-1p0_PPE/P0455/stats/JULES-ES-1p0_P0455_Annual_global.nc
Error in R_nc4_inq_varndims: NetCDF: Not a valid ID
Error in ncvar_ndims(ncid, varid) : error returned from C call
Error in R_nc4_close: NetCDF: Not a valid ID
Error in R_nc4_open: No such file or directory
Error in nc_open(paste0(fn)) : 
  Error in nc_open trying to open file /project/carbon_ppe/JULES-ES-1p0_PPE/P0457/stats/JULES-ES-1p0_P0457_Annual_global.nc
Error in R_nc4_inq_varndims: NetCDF: Not a valid ID
Error in ncvar_ndims(ncid, varid) : error returned from C call
Error in R_nc4_close: NetCDF: Not a valid ID
Error in R_nc4_open: No such file or directory
Error in nc_open(paste0(fn)) : 
  Error in nc_open trying to open file /project/carbon_ppe/JULES-ES-1p0_PPE/P0069/stats/JULES-ES-1p0_P0069_Annual_global.nc
Error in R_nc4_inq_varndims: NetCDF: Not a valid ID
Error in ncvar_ndims(ncid, varid) : error returned from C call
Error in R_nc4_close: NetCDF: Not a valid ID
Error in R_nc4_open: No such file or directory
Error in nc_open(paste0(fn)) : 
  Error in nc_open trying to open file /project/carbon_ppe/JULES-ES-1p0_PPE/P0086/stats/JULES-ES-1p0_P0086_Annual_global.nc
Error in R_nc4_inq_varndims: NetCDF: Not a valid ID
Error in ncvar_ndims(ncid, varid) : error returned from C call
Error in R_nc4_close: NetCDF: Not a valid ID
Error in R_nc4_open: No such file or directory
Error in nc_open(paste0(fn)) : 
  Error in nc_open trying to open file /project/carbon_ppe/JULES-ES-1p0_PPE/P0144/stats/JULES-ES-1p0_P0144_Annual_global.nc
Error in R_nc4_inq_varndims: NetCDF: Not a valid ID
Error in ncvar_ndims(ncid, varid) : error returned from C call
Error in R_nc4_close: NetCDF: Not a valid ID
Error in R_nc4_open: No such file or directory
Error in nc_open(paste0(fn)) : 
  Error in nc_open trying to open file /project/carbon_ppe/JULES-ES-1p0_PPE/P0165/stats/JULES-ES-1p0_P0165_Annual_global.nc
Error in R_nc4_inq_varndims: NetCDF: Not a valid ID
Error in ncvar_ndims(ncid, varid) : error returned from C call
Error in R_nc4_close: NetCDF: Not a valid ID
Error in R_nc4_open: No such file or directory
Error in nc_open(paste0(fn)) : 
  Error in nc_open trying to open file /project/carbon_ppe/JULES-ES-1p0_PPE/P0168/stats/JULES-ES-1p0_P0168_Annual_global.nc
Error in R_nc4_inq_varndims: NetCDF: Not a valid ID
Error in ncvar_ndims(ncid, varid) : error returned from C call
Error in R_nc4_close: NetCDF: Not a valid ID
Error in R_nc4_open: No such file or directory
Error in nc_open(paste0(fn)) : 
  Error in nc_open trying to open file /project/carbon_ppe/JULES-ES-1p0_PPE/P0183/stats/JULES-ES-1p0_P0183_Annual_global.nc
Error in R_nc4_inq_varndims: NetCDF: Not a valid ID
Error in ncvar_ndims(ncid, varid) : error returned from C call
Error in R_nc4_close: NetCDF: Not a valid ID
Error in R_nc4_open: No such file or directory
Error in nc_open(paste0(fn)) : 
  Error in nc_open trying to open file /project/carbon_ppe/JULES-ES-1p0_PPE/P0185/stats/JULES-ES-1p0_P0185_Annual_global.nc
Error in R_nc4_inq_varndims: NetCDF: Not a valid ID
Error in ncvar_ndims(ncid, varid) : error returned from C call
Error in R_nc4_close: NetCDF: Not a valid ID
Error in R_nc4_open: No such file or directory
Error in nc_open(paste0(fn)) : 
  Error in nc_open trying to open file /project/carbon_ppe/JULES-ES-1p0_PPE/P0214/stats/JULES-ES-1p0_P0214_Annual_global.nc
Error in R_nc4_inq_varndims: NetCDF: Not a valid ID
Error in ncvar_ndims(ncid, varid) : error returned from C call
Error in R_nc4_close: NetCDF: Not a valid ID
Error in R_nc4_open: No such file or directory
Error in nc_open(paste0(fn)) : 
  Error in nc_open trying to open file /project/carbon_ppe/JULES-ES-1p0_PPE/P0216/stats/JULES-ES-1p0_P0216_Annual_global.nc
Error in R_nc4_inq_varndims: NetCDF: Not a valid ID
Error in ncvar_ndims(ncid, varid) : error returned from C call
Error in R_nc4_close: NetCDF: Not a valid ID
Error in R_nc4_open: No such file or directory
Error in nc_open(paste0(fn)) : 
  Error in nc_open trying to open file /project/carbon_ppe/JULES-ES-1p0_PPE/P0235/stats/JULES-ES-1p0_P0235_Annual_global.nc
Error in R_nc4_inq_varndims: NetCDF: Not a valid ID
Error in ncvar_ndims(ncid, varid) : error returned from C call
Error in R_nc4_close: NetCDF: Not a valid ID
Error in R_nc4_open: No such file or directory
Error in nc_open(paste0(fn)) : 
  Error in nc_open trying to open file /project/carbon_ppe/JULES-ES-1p0_PPE/P0238/stats/JULES-ES-1p0_P0238_Annual_global.nc
Error in R_nc4_inq_varndims: NetCDF: Not a valid ID
Error in ncvar_ndims(ncid, varid) : error returned from C call
Error in R_nc4_close: NetCDF: Not a valid ID
Error in R_nc4_open: No such file or directory
Error in nc_open(paste0(fn)) : 
  Error in nc_open trying to open file /project/carbon_ppe/JULES-ES-1p0_PPE/P0251/stats/JULES-ES-1p0_P0251_Annual_global.nc
Error in R_nc4_inq_varndims: NetCDF: Not a valid ID
Error in ncvar_ndims(ncid, varid) : error returned from C call
Error in R_nc4_close: NetCDF: Not a valid ID
Error in R_nc4_open: No such file or directory
Error in nc_open(paste0(fn)) : 
  Error in nc_open trying to open file /project/carbon_ppe/JULES-ES-1p0_PPE/P0259/stats/JULES-ES-1p0_P0259_Annual_global.nc
Error in R_nc4_inq_varndims: NetCDF: Not a valid ID
Error in ncvar_ndims(ncid, varid) : error returned from C call
Error in R_nc4_close: NetCDF: Not a valid ID
Error in R_nc4_open: No such file or directory
Error in nc_open(paste0(fn)) : 
  Error in nc_open trying to open file /project/carbon_ppe/JULES-ES-1p0_PPE/P0285/stats/JULES-ES-1p0_P0285_Annual_global.nc
Error in R_nc4_inq_varndims: NetCDF: Not a valid ID
Error in ncvar_ndims(ncid, varid) : error returned from C call
Error in R_nc4_close: NetCDF: Not a valid ID
Error in R_nc4_open: No such file or directory
Error in nc_open(paste0(fn)) : 
  Error in nc_open trying to open file /project/carbon_ppe/JULES-ES-1p0_PPE/P0357/stats/JULES-ES-1p0_P0357_Annual_global.nc
Error in R_nc4_inq_varndims: NetCDF: Not a valid ID
Error in ncvar_ndims(ncid, varid) : error returned from C call
Error in R_nc4_close: NetCDF: Not a valid ID
Error in R_nc4_open: No such file or directory
Error in nc_open(paste0(fn)) : 
  Error in nc_open trying to open file /project/carbon_ppe/JULES-ES-1p0_PPE/P0376/stats/JULES-ES-1p0_P0376_Annual_global.nc
Error in R_nc4_inq_varndims: NetCDF: Not a valid ID
Error in ncvar_ndims(ncid, varid) : error returned from C call
Error in R_nc4_close: NetCDF: Not a valid ID
Error in R_nc4_open: No such file or directory
Error in nc_open(paste0(fn)) : 
  Error in nc_open trying to open file /project/carbon_ppe/JULES-ES-1p0_PPE/P0387/stats/JULES-ES-1p0_P0387_Annual_global.nc
Error in R_nc4_inq_varndims: NetCDF: Not a valid ID
Error in ncvar_ndims(ncid, varid) : error returned from C call
Error in R_nc4_close: NetCDF: Not a valid ID
Error in R_nc4_open: No such file or directory
Error in nc_open(paste0(fn)) : 
  Error in nc_open trying to open file /project/carbon_ppe/JULES-ES-1p0_PPE/P0394/stats/JULES-ES-1p0_P0394_Annual_global.nc
Error in R_nc4_inq_varndims: NetCDF: Not a valid ID
Error in ncvar_ndims(ncid, varid) : error returned from C call
Error in R_nc4_close: NetCDF: Not a valid ID
Error in R_nc4_open: No such file or directory
Error in nc_open(paste0(fn)) : 
  Error in nc_open trying to open file /project/carbon_ppe/JULES-ES-1p0_PPE/P0405/stats/JULES-ES-1p0_P0405_Annual_global.nc
Error in R_nc4_inq_varndims: NetCDF: Not a valid ID
Error in ncvar_ndims(ncid, varid) : error returned from C call
Error in R_nc4_close: NetCDF: Not a valid ID
Error in R_nc4_open: No such file or directory
Error in nc_open(paste0(fn)) : 
  Error in nc_open trying to open file /project/carbon_ppe/JULES-ES-1p0_PPE/P0424/stats/JULES-ES-1p0_P0424_Annual_global.nc
Error in R_nc4_inq_varndims: NetCDF: Not a valid ID
Error in ncvar_ndims(ncid, varid) : error returned from C call
Error in R_nc4_close: NetCDF: Not a valid ID
Error in R_nc4_open: No such file or directory
Error in nc_open(paste0(fn)) : 
  Error in nc_open trying to open file /project/carbon_ppe/JULES-ES-1p0_PPE/P0455/stats/JULES-ES-1p0_P0455_Annual_global.nc
Error in R_nc4_inq_varndims: NetCDF: Not a valid ID
Error in ncvar_ndims(ncid, varid) : error returned from C call
Error in R_nc4_close: NetCDF: Not a valid ID
Error in R_nc4_open: No such file or directory
Error in nc_open(paste0(fn)) : 
  Error in nc_open trying to open file /project/carbon_ppe/JULES-ES-1p0_PPE/P0457/stats/JULES-ES-1p0_P0457_Annual_global.nc
Error in R_nc4_inq_varndims: NetCDF: Not a valid ID
Error in ncvar_ndims(ncid, varid) : error returned from C call
Error in R_nc4_close: NetCDF: Not a valid ID
Error in R_nc4_open: No such file or directory
Error in nc_open(paste0(fn)) : 
  Error in nc_open trying to open file /project/carbon_ppe/JULES-ES-1p0_PPE/P0069/stats/JULES-ES-1p0_P0069_Annual_global.nc
Error in R_nc4_inq_varndims: NetCDF: Not a valid ID
Error in ncvar_ndims(ncid, varid) : error returned from C call
Error in R_nc4_close: NetCDF: Not a valid ID
Error in R_nc4_open: No such file or directory
Error in nc_open(paste0(fn)) : 
  Error in nc_open trying to open file /project/carbon_ppe/JULES-ES-1p0_PPE/P0086/stats/JULES-ES-1p0_P0086_Annual_global.nc
Error in R_nc4_inq_varndims: NetCDF: Not a valid ID
Error in ncvar_ndims(ncid, varid) : error returned from C call
Error in R_nc4_close: NetCDF: Not a valid ID
Error in R_nc4_open: No such file or directory
Error in nc_open(paste0(fn)) : 
  Error in nc_open trying to open file /project/carbon_ppe/JULES-ES-1p0_PPE/P0144/stats/JULES-ES-1p0_P0144_Annual_global.nc
Error in R_nc4_inq_varndims: NetCDF: Not a valid ID
Error in ncvar_ndims(ncid, varid) : error returned from C call
Error in R_nc4_close: NetCDF: Not a valid ID
Error in R_nc4_open: No such file or directory
Error in nc_open(paste0(fn)) : 
  Error in nc_open trying to open file /project/carbon_ppe/JULES-ES-1p0_PPE/P0165/stats/JULES-ES-1p0_P0165_Annual_global.nc
Error in R_nc4_inq_varndims: NetCDF: Not a valid ID
Error in ncvar_ndims(ncid, varid) : error returned from C call
Error in R_nc4_close: NetCDF: Not a valid ID
Error in R_nc4_open: No such file or directory
Error in nc_open(paste0(fn)) : 
  Error in nc_open trying to open file /project/carbon_ppe/JULES-ES-1p0_PPE/P0168/stats/JULES-ES-1p0_P0168_Annual_global.nc
Error in R_nc4_inq_varndims: NetCDF: Not a valid ID
Error in ncvar_ndims(ncid, varid) : error returned from C call
Error in R_nc4_close: NetCDF: Not a valid ID
Error in R_nc4_open: No such file or directory
Error in nc_open(paste0(fn)) : 
  Error in nc_open trying to open file /project/carbon_ppe/JULES-ES-1p0_PPE/P0183/stats/JULES-ES-1p0_P0183_Annual_global.nc
Error in R_nc4_inq_varndims: NetCDF: Not a valid ID
Error in ncvar_ndims(ncid, varid) : error returned from C call
Error in R_nc4_close: NetCDF: Not a valid ID
Error in R_nc4_open: No such file or directory
Error in nc_open(paste0(fn)) : 
  Error in nc_open trying to open file /project/carbon_ppe/JULES-ES-1p0_PPE/P0185/stats/JULES-ES-1p0_P0185_Annual_global.nc
Error in R_nc4_inq_varndims: NetCDF: Not a valid ID
Error in ncvar_ndims(ncid, varid) : error returned from C call
Error in R_nc4_close: NetCDF: Not a valid ID
Error in R_nc4_open: No such file or directory
Error in nc_open(paste0(fn)) : 
  Error in nc_open trying to open file /project/carbon_ppe/JULES-ES-1p0_PPE/P0214/stats/JULES-ES-1p0_P0214_Annual_global.nc
Error in R_nc4_inq_varndims: NetCDF: Not a valid ID
Error in ncvar_ndims(ncid, varid) : error returned from C call
Error in R_nc4_close: NetCDF: Not a valid ID
Error in R_nc4_open: No such file or directory
Error in nc_open(paste0(fn)) : 
  Error in nc_open trying to open file /project/carbon_ppe/JULES-ES-1p0_PPE/P0216/stats/JULES-ES-1p0_P0216_Annual_global.nc
Error in R_nc4_inq_varndims: NetCDF: Not a valid ID
Error in ncvar_ndims(ncid, varid) : error returned from C call
Error in R_nc4_close: NetCDF: Not a valid ID
Error in R_nc4_open: No such file or directory
Error in nc_open(paste0(fn)) : 
  Error in nc_open trying to open file /project/carbon_ppe/JULES-ES-1p0_PPE/P0235/stats/JULES-ES-1p0_P0235_Annual_global.nc
Error in R_nc4_inq_varndims: NetCDF: Not a valid ID
Error in ncvar_ndims(ncid, varid) : error returned from C call
Error in R_nc4_close: NetCDF: Not a valid ID
Error in R_nc4_open: No such file or directory
Error in nc_open(paste0(fn)) : 
  Error in nc_open trying to open file /project/carbon_ppe/JULES-ES-1p0_PPE/P0238/stats/JULES-ES-1p0_P0238_Annual_global.nc
Error in R_nc4_inq_varndims: NetCDF: Not a valid ID
Error in ncvar_ndims(ncid, varid) : error returned from C call
Error in R_nc4_close: NetCDF: Not a valid ID
Error in R_nc4_open: No such file or directory
Error in nc_open(paste0(fn)) : 
  Error in nc_open trying to open file /project/carbon_ppe/JULES-ES-1p0_PPE/P0251/stats/JULES-ES-1p0_P0251_Annual_global.nc
Error in R_nc4_inq_varndims: NetCDF: Not a valid ID
Error in ncvar_ndims(ncid, varid) : error returned from C call
Error in R_nc4_close: NetCDF: Not a valid ID
Error in R_nc4_open: No such file or directory
Error in nc_open(paste0(fn)) : 
  Error in nc_open trying to open file /project/carbon_ppe/JULES-ES-1p0_PPE/P0259/stats/JULES-ES-1p0_P0259_Annual_global.nc
Error in R_nc4_inq_varndims: NetCDF: Not a valid ID
Error in ncvar_ndims(ncid, varid) : error returned from C call
Error in R_nc4_close: NetCDF: Not a valid ID
Error in R_nc4_open: No such file or directory
Error in nc_open(paste0(fn)) : 
  Error in nc_open trying to open file /project/carbon_ppe/JULES-ES-1p0_PPE/P0285/stats/JULES-ES-1p0_P0285_Annual_global.nc
Error in R_nc4_inq_varndims: NetCDF: Not a valid ID
Error in ncvar_ndims(ncid, varid) : error returned from C call
Error in R_nc4_close: NetCDF: Not a valid ID
Error in R_nc4_open: No such file or directory
Error in nc_open(paste0(fn)) : 
  Error in nc_open trying to open file /project/carbon_ppe/JULES-ES-1p0_PPE/P0357/stats/JULES-ES-1p0_P0357_Annual_global.nc
Error in R_nc4_inq_varndims: NetCDF: Not a valid ID
Error in ncvar_ndims(ncid, varid) : error returned from C call
Error in R_nc4_close: NetCDF: Not a valid ID
Error in R_nc4_open: No such file or directory
Error in nc_open(paste0(fn)) : 
  Error in nc_open trying to open file /project/carbon_ppe/JULES-ES-1p0_PPE/P0376/stats/JULES-ES-1p0_P0376_Annual_global.nc
Error in R_nc4_inq_varndims: NetCDF: Not a valid ID
Error in ncvar_ndims(ncid, varid) : error returned from C call
Error in R_nc4_close: NetCDF: Not a valid ID
Error in R_nc4_open: No such file or directory
Error in nc_open(paste0(fn)) : 
  Error in nc_open trying to open file /project/carbon_ppe/JULES-ES-1p0_PPE/P0387/stats/JULES-ES-1p0_P0387_Annual_global.nc
Error in R_nc4_inq_varndims: NetCDF: Not a valid ID
Error in ncvar_ndims(ncid, varid) : error returned from C call
Error in R_nc4_close: NetCDF: Not a valid ID
Error in R_nc4_open: No such file or directory
Error in nc_open(paste0(fn)) : 
  Error in nc_open trying to open file /project/carbon_ppe/JULES-ES-1p0_PPE/P0394/stats/JULES-ES-1p0_P0394_Annual_global.nc
Error in R_nc4_inq_varndims: NetCDF: Not a valid ID
Error in ncvar_ndims(ncid, varid) : error returned from C call
Error in R_nc4_close: NetCDF: Not a valid ID
Error in R_nc4_open: No such file or directory
Error in nc_open(paste0(fn)) : 
  Error in nc_open trying to open file /project/carbon_ppe/JULES-ES-1p0_PPE/P0405/stats/JULES-ES-1p0_P0405_Annual_global.nc
Error in R_nc4_inq_varndims: NetCDF: Not a valid ID
Error in ncvar_ndims(ncid, varid) : error returned from C call
Error in R_nc4_close: NetCDF: Not a valid ID
Error in R_nc4_open: No such file or directory
Error in nc_open(paste0(fn)) : 
  Error in nc_open trying to open file /project/carbon_ppe/JULES-ES-1p0_PPE/P0424/stats/JULES-ES-1p0_P0424_Annual_global.nc
Error in R_nc4_inq_varndims: NetCDF: Not a valid ID
Error in ncvar_ndims(ncid, varid) : error returned from C call
Error in R_nc4_close: NetCDF: Not a valid ID
Error in R_nc4_open: No such file or directory
Error in nc_open(paste0(fn)) : 
  Error in nc_open trying to open file /project/carbon_ppe/JULES-ES-1p0_PPE/P0455/stats/JULES-ES-1p0_P0455_Annual_global.nc
Error in R_nc4_inq_varndims: NetCDF: Not a valid ID
Error in ncvar_ndims(ncid, varid) : error returned from C call
Error in R_nc4_close: NetCDF: Not a valid ID
Error in R_nc4_open: No such file or directory
Error in nc_open(paste0(fn)) : 
  Error in nc_open trying to open file /project/carbon_ppe/JULES-ES-1p0_PPE/P0457/stats/JULES-ES-1p0_P0457_Annual_global.nc
Error in R_nc4_inq_varndims: NetCDF: Not a valid ID
Error in ncvar_ndims(ncid, varid) : error returned from C call
Error in R_nc4_close: NetCDF: Not a valid ID
Error in R_nc4_open: No such file or directory
Error in nc_open(paste0(fn)) : 
  Error in nc_open trying to open file /project/carbon_ppe/JULES-ES-1p0_PPE/P0069/stats/JULES-ES-1p0_P0069_Annual_global.nc
Error in R_nc4_inq_varndims: NetCDF: Not a valid ID
Error in ncvar_ndims(ncid, varid) : error returned from C call
Error in R_nc4_close: NetCDF: Not a valid ID
Error in R_nc4_open: No such file or directory
Error in nc_open(paste0(fn)) : 
  Error in nc_open trying to open file /project/carbon_ppe/JULES-ES-1p0_PPE/P0086/stats/JULES-ES-1p0_P0086_Annual_global.nc
Error in R_nc4_inq_varndims: NetCDF: Not a valid ID
Error in ncvar_ndims(ncid, varid) : error returned from C call
Error in R_nc4_close: NetCDF: Not a valid ID
Error in R_nc4_open: No such file or directory
Error in nc_open(paste0(fn)) : 
  Error in nc_open trying to open file /project/carbon_ppe/JULES-ES-1p0_PPE/P0144/stats/JULES-ES-1p0_P0144_Annual_global.nc
Error in R_nc4_inq_varndims: NetCDF: Not a valid ID
Error in ncvar_ndims(ncid, varid) : error returned from C call
Error in R_nc4_close: NetCDF: Not a valid ID
Error in R_nc4_open: No such file or directory
Error in nc_open(paste0(fn)) : 
  Error in nc_open trying to open file /project/carbon_ppe/JULES-ES-1p0_PPE/P0165/stats/JULES-ES-1p0_P0165_Annual_global.nc
Error in R_nc4_inq_varndims: NetCDF: Not a valid ID
Error in ncvar_ndims(ncid, varid) : error returned from C call
Error in R_nc4_close: NetCDF: Not a valid ID
Error in R_nc4_open: No such file or directory
Error in nc_open(paste0(fn)) : 
  Error in nc_open trying to open file /project/carbon_ppe/JULES-ES-1p0_PPE/P0168/stats/JULES-ES-1p0_P0168_Annual_global.nc
Error in R_nc4_inq_varndims: NetCDF: Not a valid ID
Error in ncvar_ndims(ncid, varid) : error returned from C call
Error in R_nc4_close: NetCDF: Not a valid ID
Error in R_nc4_open: No such file or directory
Error in nc_open(paste0(fn)) : 
  Error in nc_open trying to open file /project/carbon_ppe/JULES-ES-1p0_PPE/P0183/stats/JULES-ES-1p0_P0183_Annual_global.nc
Error in R_nc4_inq_varndims: NetCDF: Not a valid ID
Error in ncvar_ndims(ncid, varid) : error returned from C call
Error in R_nc4_close: NetCDF: Not a valid ID
Error in R_nc4_open: No such file or directory
Error in nc_open(paste0(fn)) : 
  Error in nc_open trying to open file /project/carbon_ppe/JULES-ES-1p0_PPE/P0185/stats/JULES-ES-1p0_P0185_Annual_global.nc
Error in R_nc4_inq_varndims: NetCDF: Not a valid ID
Error in ncvar_ndims(ncid, varid) : error returned from C call
Error in R_nc4_close: NetCDF: Not a valid ID
Error in R_nc4_open: No such file or directory
Error in nc_open(paste0(fn)) : 
  Error in nc_open trying to open file /project/carbon_ppe/JULES-ES-1p0_PPE/P0214/stats/JULES-ES-1p0_P0214_Annual_global.nc
Error in R_nc4_inq_varndims: NetCDF: Not a valid ID
Error in ncvar_ndims(ncid, varid) : error returned from C call
Error in R_nc4_close: NetCDF: Not a valid ID
Error in R_nc4_open: No such file or directory
Error in nc_open(paste0(fn)) : 
  Error in nc_open trying to open file /project/carbon_ppe/JULES-ES-1p0_PPE/P0216/stats/JULES-ES-1p0_P0216_Annual_global.nc
Error in R_nc4_inq_varndims: NetCDF: Not a valid ID
Error in ncvar_ndims(ncid, varid) : error returned from C call
Error in R_nc4_close: NetCDF: Not a valid ID
Error in R_nc4_open: No such file or directory
Error in nc_open(paste0(fn)) : 
  Error in nc_open trying to open file /project/carbon_ppe/JULES-ES-1p0_PPE/P0235/stats/JULES-ES-1p0_P0235_Annual_global.nc
Error in R_nc4_inq_varndims: NetCDF: Not a valid ID
Error in ncvar_ndims(ncid, varid) : error returned from C call
Error in R_nc4_close: NetCDF: Not a valid ID
Error in R_nc4_open: No such file or directory
Error in nc_open(paste0(fn)) : 
  Error in nc_open trying to open file /project/carbon_ppe/JULES-ES-1p0_PPE/P0238/stats/JULES-ES-1p0_P0238_Annual_global.nc
Error in R_nc4_inq_varndims: NetCDF: Not a valid ID
Error in ncvar_ndims(ncid, varid) : error returned from C call
Error in R_nc4_close: NetCDF: Not a valid ID
Error in R_nc4_open: No such file or directory
Error in nc_open(paste0(fn)) : 
  Error in nc_open trying to open file /project/carbon_ppe/JULES-ES-1p0_PPE/P0251/stats/JULES-ES-1p0_P0251_Annual_global.nc
Error in R_nc4_inq_varndims: NetCDF: Not a valid ID
Error in ncvar_ndims(ncid, varid) : error returned from C call
Error in R_nc4_close: NetCDF: Not a valid ID
Error in R_nc4_open: No such file or directory
Error in nc_open(paste0(fn)) : 
  Error in nc_open trying to open file /project/carbon_ppe/JULES-ES-1p0_PPE/P0259/stats/JULES-ES-1p0_P0259_Annual_global.nc
Error in R_nc4_inq_varndims: NetCDF: Not a valid ID
Error in ncvar_ndims(ncid, varid) : error returned from C call
Error in R_nc4_close: NetCDF: Not a valid ID
Error in R_nc4_open: No such file or directory
Error in nc_open(paste0(fn)) : 
  Error in nc_open trying to open file /project/carbon_ppe/JULES-ES-1p0_PPE/P0285/stats/JULES-ES-1p0_P0285_Annual_global.nc
Error in R_nc4_inq_varndims: NetCDF: Not a valid ID
Error in ncvar_ndims(ncid, varid) : error returned from C call
Error in R_nc4_close: NetCDF: Not a valid ID
Error in R_nc4_open: No such file or directory
Error in nc_open(paste0(fn)) : 
  Error in nc_open trying to open file /project/carbon_ppe/JULES-ES-1p0_PPE/P0357/stats/JULES-ES-1p0_P0357_Annual_global.nc
Error in R_nc4_inq_varndims: NetCDF: Not a valid ID
Error in ncvar_ndims(ncid, varid) : error returned from C call
Error in R_nc4_close: NetCDF: Not a valid ID
Error in R_nc4_open: No such file or directory
Error in nc_open(paste0(fn)) : 
  Error in nc_open trying to open file /project/carbon_ppe/JULES-ES-1p0_PPE/P0376/stats/JULES-ES-1p0_P0376_Annual_global.nc
Error in R_nc4_inq_varndims: NetCDF: Not a valid ID
Error in ncvar_ndims(ncid, varid) : error returned from C call
Error in R_nc4_close: NetCDF: Not a valid ID
Error in R_nc4_open: No such file or directory
Error in nc_open(paste0(fn)) : 
  Error in nc_open trying to open file /project/carbon_ppe/JULES-ES-1p0_PPE/P0387/stats/JULES-ES-1p0_P0387_Annual_global.nc
Error in R_nc4_inq_varndims: NetCDF: Not a valid ID
Error in ncvar_ndims(ncid, varid) : error returned from C call
Error in R_nc4_close: NetCDF: Not a valid ID
Error in R_nc4_open: No such file or directory
Error in nc_open(paste0(fn)) : 
  Error in nc_open trying to open file /project/carbon_ppe/JULES-ES-1p0_PPE/P0394/stats/JULES-ES-1p0_P0394_Annual_global.nc
Error in R_nc4_inq_varndims: NetCDF: Not a valid ID
Error in ncvar_ndims(ncid, varid) : error returned from C call
Error in R_nc4_close: NetCDF: Not a valid ID
Error in R_nc4_open: No such file or directory
Error in nc_open(paste0(fn)) : 
  Error in nc_open trying to open file /project/carbon_ppe/JULES-ES-1p0_PPE/P0405/stats/JULES-ES-1p0_P0405_Annual_global.nc
Error in R_nc4_inq_varndims: NetCDF: Not a valid ID
Error in ncvar_ndims(ncid, varid) : error returned from C call
Error in R_nc4_close: NetCDF: Not a valid ID
Error in R_nc4_open: No such file or directory
Error in nc_open(paste0(fn)) : 
  Error in nc_open trying to open file /project/carbon_ppe/JULES-ES-1p0_PPE/P0424/stats/JULES-ES-1p0_P0424_Annual_global.nc
Error in R_nc4_inq_varndims: NetCDF: Not a valid ID
Error in ncvar_ndims(ncid, varid) : error returned from C call
Error in R_nc4_close: NetCDF: Not a valid ID
Error in R_nc4_open: No such file or directory
Error in nc_open(paste0(fn)) : 
  Error in nc_open trying to open file /project/carbon_ppe/JULES-ES-1p0_PPE/P0455/stats/JULES-ES-1p0_P0455_Annual_global.nc
Error in R_nc4_inq_varndims: NetCDF: Not a valid ID
Error in ncvar_ndims(ncid, varid) : error returned from C call
Error in R_nc4_close: NetCDF: Not a valid ID
Error in R_nc4_open: No such file or directory
Error in nc_open(paste0(fn)) : 
  Error in nc_open trying to open file /project/carbon_ppe/JULES-ES-1p0_PPE/P0457/stats/JULES-ES-1p0_P0457_Annual_global.nc
Error in R_nc4_inq_varndims: NetCDF: Not a valid ID
Error in ncvar_ndims(ncid, varid) : error returned from C call
Error in R_nc4_close: NetCDF: Not a valid ID
Error in R_nc4_open: No such file or directory
Error in nc_open(paste0(fn)) : 
  Error in nc_open trying to open file /project/carbon_ppe/JULES-ES-1p0_PPE/P0069/stats/JULES-ES-1p0_P0069_Annual_global.nc
Error in R_nc4_inq_varndims: NetCDF: Not a valid ID
Error in ncvar_ndims(ncid, varid) : error returned from C call
Error in R_nc4_close: NetCDF: Not a valid ID
Error in R_nc4_open: No such file or directory
Error in nc_open(paste0(fn)) : 
  Error in nc_open trying to open file /project/carbon_ppe/JULES-ES-1p0_PPE/P0086/stats/JULES-ES-1p0_P0086_Annual_global.nc
Error in R_nc4_inq_varndims: NetCDF: Not a valid ID
Error in ncvar_ndims(ncid, varid) : error returned from C call
Error in R_nc4_close: NetCDF: Not a valid ID
Error in R_nc4_open: No such file or directory
Error in nc_open(paste0(fn)) : 
  Error in nc_open trying to open file /project/carbon_ppe/JULES-ES-1p0_PPE/P0144/stats/JULES-ES-1p0_P0144_Annual_global.nc
Error in R_nc4_inq_varndims: NetCDF: Not a valid ID
Error in ncvar_ndims(ncid, varid) : error returned from C call
Error in R_nc4_close: NetCDF: Not a valid ID
Error in R_nc4_open: No such file or directory
Error in nc_open(paste0(fn)) : 
  Error in nc_open trying to open file /project/carbon_ppe/JULES-ES-1p0_PPE/P0165/stats/JULES-ES-1p0_P0165_Annual_global.nc
Error in R_nc4_inq_varndims: NetCDF: Not a valid ID
Error in ncvar_ndims(ncid, varid) : error returned from C call
Error in R_nc4_close: NetCDF: Not a valid ID
Error in R_nc4_open: No such file or directory
Error in nc_open(paste0(fn)) : 
  Error in nc_open trying to open file /project/carbon_ppe/JULES-ES-1p0_PPE/P0168/stats/JULES-ES-1p0_P0168_Annual_global.nc
Error in R_nc4_inq_varndims: NetCDF: Not a valid ID
Error in ncvar_ndims(ncid, varid) : error returned from C call
Error in R_nc4_close: NetCDF: Not a valid ID
Error in R_nc4_open: No such file or directory
Error in nc_open(paste0(fn)) : 
  Error in nc_open trying to open file /project/carbon_ppe/JULES-ES-1p0_PPE/P0183/stats/JULES-ES-1p0_P0183_Annual_global.nc
Error in R_nc4_inq_varndims: NetCDF: Not a valid ID
Error in ncvar_ndims(ncid, varid) : error returned from C call
Error in R_nc4_close: NetCDF: Not a valid ID
Error in R_nc4_open: No such file or directory
Error in nc_open(paste0(fn)) : 
  Error in nc_open trying to open file /project/carbon_ppe/JULES-ES-1p0_PPE/P0185/stats/JULES-ES-1p0_P0185_Annual_global.nc
Error in R_nc4_inq_varndims: NetCDF: Not a valid ID
Error in ncvar_ndims(ncid, varid) : error returned from C call
Error in R_nc4_close: NetCDF: Not a valid ID
Error in R_nc4_open: No such file or directory
Error in nc_open(paste0(fn)) : 
  Error in nc_open trying to open file /project/carbon_ppe/JULES-ES-1p0_PPE/P0214/stats/JULES-ES-1p0_P0214_Annual_global.nc
Error in R_nc4_inq_varndims: NetCDF: Not a valid ID
Error in ncvar_ndims(ncid, varid) : error returned from C call
Error in R_nc4_close: NetCDF: Not a valid ID
Error in R_nc4_open: No such file or directory
Error in nc_open(paste0(fn)) : 
  Error in nc_open trying to open file /project/carbon_ppe/JULES-ES-1p0_PPE/P0216/stats/JULES-ES-1p0_P0216_Annual_global.nc
Error in R_nc4_inq_varndims: NetCDF: Not a valid ID
Error in ncvar_ndims(ncid, varid) : error returned from C call
Error in R_nc4_close: NetCDF: Not a valid ID
Error in R_nc4_open: No such file or directory
Error in nc_open(paste0(fn)) : 
  Error in nc_open trying to open file /project/carbon_ppe/JULES-ES-1p0_PPE/P0235/stats/JULES-ES-1p0_P0235_Annual_global.nc
Error in R_nc4_inq_varndims: NetCDF: Not a valid ID
Error in ncvar_ndims(ncid, varid) : error returned from C call
Error in R_nc4_close: NetCDF: Not a valid ID
Error in R_nc4_open: No such file or directory
Error in nc_open(paste0(fn)) : 
  Error in nc_open trying to open file /project/carbon_ppe/JULES-ES-1p0_PPE/P0238/stats/JULES-ES-1p0_P0238_Annual_global.nc
Error in R_nc4_inq_varndims: NetCDF: Not a valid ID
Error in ncvar_ndims(ncid, varid) : error returned from C call
Error in R_nc4_close: NetCDF: Not a valid ID
Error in R_nc4_open: No such file or directory
Error in nc_open(paste0(fn)) : 
  Error in nc_open trying to open file /project/carbon_ppe/JULES-ES-1p0_PPE/P0251/stats/JULES-ES-1p0_P0251_Annual_global.nc
Error in R_nc4_inq_varndims: NetCDF: Not a valid ID
Error in ncvar_ndims(ncid, varid) : error returned from C call
Error in R_nc4_close: NetCDF: Not a valid ID
Error in R_nc4_open: No such file or directory
Error in nc_open(paste0(fn)) : 
  Error in nc_open trying to open file /project/carbon_ppe/JULES-ES-1p0_PPE/P0259/stats/JULES-ES-1p0_P0259_Annual_global.nc
Error in R_nc4_inq_varndims: NetCDF: Not a valid ID
Error in ncvar_ndims(ncid, varid) : error returned from C call
Error in R_nc4_close: NetCDF: Not a valid ID
Error in R_nc4_open: No such file or directory
Error in nc_open(paste0(fn)) : 
  Error in nc_open trying to open file /project/carbon_ppe/JULES-ES-1p0_PPE/P0285/stats/JULES-ES-1p0_P0285_Annual_global.nc
Error in R_nc4_inq_varndims: NetCDF: Not a valid ID
Error in ncvar_ndims(ncid, varid) : error returned from C call
Error in R_nc4_close: NetCDF: Not a valid ID
Error in R_nc4_open: No such file or directory
Error in nc_open(paste0(fn)) : 
  Error in nc_open trying to open file /project/carbon_ppe/JULES-ES-1p0_PPE/P0357/stats/JULES-ES-1p0_P0357_Annual_global.nc
Error in R_nc4_inq_varndims: NetCDF: Not a valid ID
Error in ncvar_ndims(ncid, varid) : error returned from C call
Error in R_nc4_close: NetCDF: Not a valid ID
Error in R_nc4_open: No such file or directory
Error in nc_open(paste0(fn)) : 
  Error in nc_open trying to open file /project/carbon_ppe/JULES-ES-1p0_PPE/P0376/stats/JULES-ES-1p0_P0376_Annual_global.nc
Error in R_nc4_inq_varndims: NetCDF: Not a valid ID
Error in ncvar_ndims(ncid, varid) : error returned from C call
Error in R_nc4_close: NetCDF: Not a valid ID
Error in R_nc4_open: No such file or directory
Error in nc_open(paste0(fn)) : 
  Error in nc_open trying to open file /project/carbon_ppe/JULES-ES-1p0_PPE/P0387/stats/JULES-ES-1p0_P0387_Annual_global.nc
Error in R_nc4_inq_varndims: NetCDF: Not a valid ID
Error in ncvar_ndims(ncid, varid) : error returned from C call
Error in R_nc4_close: NetCDF: Not a valid ID
Error in R_nc4_open: No such file or directory
Error in nc_open(paste0(fn)) : 
  Error in nc_open trying to open file /project/carbon_ppe/JULES-ES-1p0_PPE/P0394/stats/JULES-ES-1p0_P0394_Annual_global.nc
Error in R_nc4_inq_varndims: NetCDF: Not a valid ID
Error in ncvar_ndims(ncid, varid) : error returned from C call
Error in R_nc4_close: NetCDF: Not a valid ID
Error in R_nc4_open: No such file or directory
Error in nc_open(paste0(fn)) : 
  Error in nc_open trying to open file /project/carbon_ppe/JULES-ES-1p0_PPE/P0405/stats/JULES-ES-1p0_P0405_Annual_global.nc
Error in R_nc4_inq_varndims: NetCDF: Not a valid ID
Error in ncvar_ndims(ncid, varid) : error returned from C call
Error in R_nc4_close: NetCDF: Not a valid ID
Error in R_nc4_open: No such file or directory
Error in nc_open(paste0(fn)) : 
  Error in nc_open trying to open file /project/carbon_ppe/JULES-ES-1p0_PPE/P0424/stats/JULES-ES-1p0_P0424_Annual_global.nc
Error in R_nc4_inq_varndims: NetCDF: Not a valid ID
Error in ncvar_ndims(ncid, varid) : error returned from C call
Error in R_nc4_close: NetCDF: Not a valid ID
Error in R_nc4_open: No such file or directory
Error in nc_open(paste0(fn)) : 
  Error in nc_open trying to open file /project/carbon_ppe/JULES-ES-1p0_PPE/P0455/stats/JULES-ES-1p0_P0455_Annual_global.nc
Error in R_nc4_inq_varndims: NetCDF: Not a valid ID
Error in ncvar_ndims(ncid, varid) : error returned from C call
Error in R_nc4_close: NetCDF: Not a valid ID
Error in R_nc4_open: No such file or directory
Error in nc_open(paste0(fn)) : 
  Error in nc_open trying to open file /project/carbon_ppe/JULES-ES-1p0_PPE/P0457/stats/JULES-ES-1p0_P0457_Annual_global.nc
Error in R_nc4_inq_varndims: NetCDF: Not a valid ID
Error in ncvar_ndims(ncid, varid) : error returned from C call
Error in R_nc4_close: NetCDF: Not a valid ID
Error in R_nc4_open: No such file or directory
Error in nc_open(paste0(fn)) : 
  Error in nc_open trying to open file /project/carbon_ppe/JULES-ES-1p0_PPE/P0069/stats/JULES-ES-1p0_P0069_Annual_global.nc
Error in R_nc4_inq_varndims: NetCDF: Not a valid ID
Error in ncvar_ndims(ncid, varid) : error returned from C call
Error in R_nc4_close: NetCDF: Not a valid ID
Error in R_nc4_open: No such file or directory
Error in nc_open(paste0(fn)) : 
  Error in nc_open trying to open file /project/carbon_ppe/JULES-ES-1p0_PPE/P0086/stats/JULES-ES-1p0_P0086_Annual_global.nc
Error in R_nc4_inq_varndims: NetCDF: Not a valid ID
Error in ncvar_ndims(ncid, varid) : error returned from C call
Error in R_nc4_close: NetCDF: Not a valid ID
Error in R_nc4_open: No such file or directory
Error in nc_open(paste0(fn)) : 
  Error in nc_open trying to open file /project/carbon_ppe/JULES-ES-1p0_PPE/P0144/stats/JULES-ES-1p0_P0144_Annual_global.nc
Error in R_nc4_inq_varndims: NetCDF: Not a valid ID
Error in ncvar_ndims(ncid, varid) : error returned from C call
Error in R_nc4_close: NetCDF: Not a valid ID
Error in R_nc4_open: No such file or directory
Error in nc_open(paste0(fn)) : 
  Error in nc_open trying to open file /project/carbon_ppe/JULES-ES-1p0_PPE/P0165/stats/JULES-ES-1p0_P0165_Annual_global.nc
Error in R_nc4_inq_varndims: NetCDF: Not a valid ID
Error in ncvar_ndims(ncid, varid) : error returned from C call
Error in R_nc4_close: NetCDF: Not a valid ID
Error in R_nc4_open: No such file or directory
Error in nc_open(paste0(fn)) : 
  Error in nc_open trying to open file /project/carbon_ppe/JULES-ES-1p0_PPE/P0168/stats/JULES-ES-1p0_P0168_Annual_global.nc
Error in R_nc4_inq_varndims: NetCDF: Not a valid ID
Error in ncvar_ndims(ncid, varid) : error returned from C call
Error in R_nc4_close: NetCDF: Not a valid ID
Error in R_nc4_open: No such file or directory
Error in nc_open(paste0(fn)) : 
  Error in nc_open trying to open file /project/carbon_ppe/JULES-ES-1p0_PPE/P0183/stats/JULES-ES-1p0_P0183_Annual_global.nc
Error in R_nc4_inq_varndims: NetCDF: Not a valid ID
Error in ncvar_ndims(ncid, varid) : error returned from C call
Error in R_nc4_close: NetCDF: Not a valid ID
Error in R_nc4_open: No such file or directory
Error in nc_open(paste0(fn)) : 
  Error in nc_open trying to open file /project/carbon_ppe/JULES-ES-1p0_PPE/P0185/stats/JULES-ES-1p0_P0185_Annual_global.nc
Error in R_nc4_inq_varndims: NetCDF: Not a valid ID
Error in ncvar_ndims(ncid, varid) : error returned from C call
Error in R_nc4_close: NetCDF: Not a valid ID
Error in R_nc4_open: No such file or directory
Error in nc_open(paste0(fn)) : 
  Error in nc_open trying to open file /project/carbon_ppe/JULES-ES-1p0_PPE/P0214/stats/JULES-ES-1p0_P0214_Annual_global.nc
Error in R_nc4_inq_varndims: NetCDF: Not a valid ID
Error in ncvar_ndims(ncid, varid) : error returned from C call
Error in R_nc4_close: NetCDF: Not a valid ID
Error in R_nc4_open: No such file or directory
Error in nc_open(paste0(fn)) : 
  Error in nc_open trying to open file /project/carbon_ppe/JULES-ES-1p0_PPE/P0216/stats/JULES-ES-1p0_P0216_Annual_global.nc
Error in R_nc4_inq_varndims: NetCDF: Not a valid ID
Error in ncvar_ndims(ncid, varid) : error returned from C call
Error in R_nc4_close: NetCDF: Not a valid ID
Error in R_nc4_open: No such file or directory
Error in nc_open(paste0(fn)) : 
  Error in nc_open trying to open file /project/carbon_ppe/JULES-ES-1p0_PPE/P0235/stats/JULES-ES-1p0_P0235_Annual_global.nc
Error in R_nc4_inq_varndims: NetCDF: Not a valid ID
Error in ncvar_ndims(ncid, varid) : error returned from C call
Error in R_nc4_close: NetCDF: Not a valid ID
Error in R_nc4_open: No such file or directory
Error in nc_open(paste0(fn)) : 
  Error in nc_open trying to open file /project/carbon_ppe/JULES-ES-1p0_PPE/P0238/stats/JULES-ES-1p0_P0238_Annual_global.nc
Error in R_nc4_inq_varndims: NetCDF: Not a valid ID
Error in ncvar_ndims(ncid, varid) : error returned from C call
Error in R_nc4_close: NetCDF: Not a valid ID
Error in R_nc4_open: No such file or directory
Error in nc_open(paste0(fn)) : 
  Error in nc_open trying to open file /project/carbon_ppe/JULES-ES-1p0_PPE/P0251/stats/JULES-ES-1p0_P0251_Annual_global.nc
Error in R_nc4_inq_varndims: NetCDF: Not a valid ID
Error in ncvar_ndims(ncid, varid) : error returned from C call
Error in R_nc4_close: NetCDF: Not a valid ID
Error in R_nc4_open: No such file or directory
Error in nc_open(paste0(fn)) : 
  Error in nc_open trying to open file /project/carbon_ppe/JULES-ES-1p0_PPE/P0259/stats/JULES-ES-1p0_P0259_Annual_global.nc
Error in R_nc4_inq_varndims: NetCDF: Not a valid ID
Error in ncvar_ndims(ncid, varid) : error returned from C call
Error in R_nc4_close: NetCDF: Not a valid ID
Error in R_nc4_open: No such file or directory
Error in nc_open(paste0(fn)) : 
  Error in nc_open trying to open file /project/carbon_ppe/JULES-ES-1p0_PPE/P0285/stats/JULES-ES-1p0_P0285_Annual_global.nc
Error in R_nc4_inq_varndims: NetCDF: Not a valid ID
Error in ncvar_ndims(ncid, varid) : error returned from C call
Error in R_nc4_close: NetCDF: Not a valid ID
Error in R_nc4_open: No such file or directory
Error in nc_open(paste0(fn)) : 
  Error in nc_open trying to open file /project/carbon_ppe/JULES-ES-1p0_PPE/P0357/stats/JULES-ES-1p0_P0357_Annual_global.nc
Error in R_nc4_inq_varndims: NetCDF: Not a valid ID
Error in ncvar_ndims(ncid, varid) : error returned from C call
Error in R_nc4_close: NetCDF: Not a valid ID
Error in R_nc4_open: No such file or directory
Error in nc_open(paste0(fn)) : 
  Error in nc_open trying to open file /project/carbon_ppe/JULES-ES-1p0_PPE/P0376/stats/JULES-ES-1p0_P0376_Annual_global.nc
Error in R_nc4_inq_varndims: NetCDF: Not a valid ID
Error in ncvar_ndims(ncid, varid) : error returned from C call
Error in R_nc4_close: NetCDF: Not a valid ID
Error in R_nc4_open: No such file or directory
Error in nc_open(paste0(fn)) : 
  Error in nc_open trying to open file /project/carbon_ppe/JULES-ES-1p0_PPE/P0387/stats/JULES-ES-1p0_P0387_Annual_global.nc
Error in R_nc4_inq_varndims: NetCDF: Not a valid ID
Error in ncvar_ndims(ncid, varid) : error returned from C call
Error in R_nc4_close: NetCDF: Not a valid ID
Error in R_nc4_open: No such file or directory
Error in nc_open(paste0(fn)) : 
  Error in nc_open trying to open file /project/carbon_ppe/JULES-ES-1p0_PPE/P0394/stats/JULES-ES-1p0_P0394_Annual_global.nc
Error in R_nc4_inq_varndims: NetCDF: Not a valid ID
Error in ncvar_ndims(ncid, varid) : error returned from C call
Error in R_nc4_close: NetCDF: Not a valid ID
Error in R_nc4_open: No such file or directory
Error in nc_open(paste0(fn)) : 
  Error in nc_open trying to open file /project/carbon_ppe/JULES-ES-1p0_PPE/P0405/stats/JULES-ES-1p0_P0405_Annual_global.nc
Error in R_nc4_inq_varndims: NetCDF: Not a valid ID
Error in ncvar_ndims(ncid, varid) : error returned from C call
Error in R_nc4_close: NetCDF: Not a valid ID
Error in R_nc4_open: No such file or directory
Error in nc_open(paste0(fn)) : 
  Error in nc_open trying to open file /project/carbon_ppe/JULES-ES-1p0_PPE/P0424/stats/JULES-ES-1p0_P0424_Annual_global.nc
Error in R_nc4_inq_varndims: NetCDF: Not a valid ID
Error in ncvar_ndims(ncid, varid) : error returned from C call
Error in R_nc4_close: NetCDF: Not a valid ID
Error in R_nc4_open: No such file or directory
Error in nc_open(paste0(fn)) : 
  Error in nc_open trying to open file /project/carbon_ppe/JULES-ES-1p0_PPE/P0455/stats/JULES-ES-1p0_P0455_Annual_global.nc
Error in R_nc4_inq_varndims: NetCDF: Not a valid ID
Error in ncvar_ndims(ncid, varid) : error returned from C call
Error in R_nc4_close: NetCDF: Not a valid ID
Error in R_nc4_open: No such file or directory
Error in nc_open(paste0(fn)) : 
  Error in nc_open trying to open file /project/carbon_ppe/JULES-ES-1p0_PPE/P0457/stats/JULES-ES-1p0_P0457_Annual_global.nc
Error in R_nc4_inq_varndims: NetCDF: Not a valid ID
Error in ncvar_ndims(ncid, varid) : error returned from C call
Error in R_nc4_close: NetCDF: Not a valid ID
Error in R_nc4_open: No such file or directory
Error in nc_open(paste0(fn)) : 
  Error in nc_open trying to open file /project/carbon_ppe/JULES-ES-1p0_PPE/P0069/stats/JULES-ES-1p0_P0069_Annual_global.nc
Error in R_nc4_inq_varndims: NetCDF: Not a valid ID
Error in ncvar_ndims(ncid, varid) : error returned from C call
Error in R_nc4_close: NetCDF: Not a valid ID
Error in R_nc4_open: No such file or directory
Error in nc_open(paste0(fn)) : 
  Error in nc_open trying to open file /project/carbon_ppe/JULES-ES-1p0_PPE/P0086/stats/JULES-ES-1p0_P0086_Annual_global.nc
Error in R_nc4_inq_varndims: NetCDF: Not a valid ID
Error in ncvar_ndims(ncid, varid) : error returned from C call
Error in R_nc4_close: NetCDF: Not a valid ID
Error in R_nc4_open: No such file or directory
Error in nc_open(paste0(fn)) : 
  Error in nc_open trying to open file /project/carbon_ppe/JULES-ES-1p0_PPE/P0144/stats/JULES-ES-1p0_P0144_Annual_global.nc
Error in R_nc4_inq_varndims: NetCDF: Not a valid ID
Error in ncvar_ndims(ncid, varid) : error returned from C call
Error in R_nc4_close: NetCDF: Not a valid ID
Error in R_nc4_open: No such file or directory
Error in nc_open(paste0(fn)) : 
  Error in nc_open trying to open file /project/carbon_ppe/JULES-ES-1p0_PPE/P0165/stats/JULES-ES-1p0_P0165_Annual_global.nc
Error in R_nc4_inq_varndims: NetCDF: Not a valid ID
Error in ncvar_ndims(ncid, varid) : error returned from C call
Error in R_nc4_close: NetCDF: Not a valid ID
Error in R_nc4_open: No such file or directory
Error in nc_open(paste0(fn)) : 
  Error in nc_open trying to open file /project/carbon_ppe/JULES-ES-1p0_PPE/P0168/stats/JULES-ES-1p0_P0168_Annual_global.nc
Error in R_nc4_inq_varndims: NetCDF: Not a valid ID
Error in ncvar_ndims(ncid, varid) : error returned from C call
Error in R_nc4_close: NetCDF: Not a valid ID
Error in R_nc4_open: No such file or directory
Error in nc_open(paste0(fn)) : 
  Error in nc_open trying to open file /project/carbon_ppe/JULES-ES-1p0_PPE/P0183/stats/JULES-ES-1p0_P0183_Annual_global.nc
Error in R_nc4_inq_varndims: NetCDF: Not a valid ID
Error in ncvar_ndims(ncid, varid) : error returned from C call
Error in R_nc4_close: NetCDF: Not a valid ID
Error in R_nc4_open: No such file or directory
Error in nc_open(paste0(fn)) : 
  Error in nc_open trying to open file /project/carbon_ppe/JULES-ES-1p0_PPE/P0185/stats/JULES-ES-1p0_P0185_Annual_global.nc
Error in R_nc4_inq_varndims: NetCDF: Not a valid ID
Error in ncvar_ndims(ncid, varid) : error returned from C call
Error in R_nc4_close: NetCDF: Not a valid ID
Error in R_nc4_open: No such file or directory
Error in nc_open(paste0(fn)) : 
  Error in nc_open trying to open file /project/carbon_ppe/JULES-ES-1p0_PPE/P0214/stats/JULES-ES-1p0_P0214_Annual_global.nc
Error in R_nc4_inq_varndims: NetCDF: Not a valid ID
Error in ncvar_ndims(ncid, varid) : error returned from C call
Error in R_nc4_close: NetCDF: Not a valid ID
Error in R_nc4_open: No such file or directory
Error in nc_open(paste0(fn)) : 
  Error in nc_open trying to open file /project/carbon_ppe/JULES-ES-1p0_PPE/P0216/stats/JULES-ES-1p0_P0216_Annual_global.nc
Error in R_nc4_inq_varndims: NetCDF: Not a valid ID
Error in ncvar_ndims(ncid, varid) : error returned from C call
Error in R_nc4_close: NetCDF: Not a valid ID
Error in R_nc4_open: No such file or directory
Error in nc_open(paste0(fn)) : 
  Error in nc_open trying to open file /project/carbon_ppe/JULES-ES-1p0_PPE/P0235/stats/JULES-ES-1p0_P0235_Annual_global.nc
Error in R_nc4_inq_varndims: NetCDF: Not a valid ID
Error in ncvar_ndims(ncid, varid) : error returned from C call
Error in R_nc4_close: NetCDF: Not a valid ID
Error in R_nc4_open: No such file or directory
Error in nc_open(paste0(fn)) : 
  Error in nc_open trying to open file /project/carbon_ppe/JULES-ES-1p0_PPE/P0238/stats/JULES-ES-1p0_P0238_Annual_global.nc
Error in R_nc4_inq_varndims: NetCDF: Not a valid ID
Error in ncvar_ndims(ncid, varid) : error returned from C call
Error in R_nc4_close: NetCDF: Not a valid ID
Error in R_nc4_open: No such file or directory
Error in nc_open(paste0(fn)) : 
  Error in nc_open trying to open file /project/carbon_ppe/JULES-ES-1p0_PPE/P0251/stats/JULES-ES-1p0_P0251_Annual_global.nc
Error in R_nc4_inq_varndims: NetCDF: Not a valid ID
Error in ncvar_ndims(ncid, varid) : error returned from C call
Error in R_nc4_close: NetCDF: Not a valid ID
Error in R_nc4_open: No such file or directory
Error in nc_open(paste0(fn)) : 
  Error in nc_open trying to open file /project/carbon_ppe/JULES-ES-1p0_PPE/P0259/stats/JULES-ES-1p0_P0259_Annual_global.nc
Error in R_nc4_inq_varndims: NetCDF: Not a valid ID
Error in ncvar_ndims(ncid, varid) : error returned from C call
Error in R_nc4_close: NetCDF: Not a valid ID
Error in R_nc4_open: No such file or directory
Error in nc_open(paste0(fn)) : 
  Error in nc_open trying to open file /project/carbon_ppe/JULES-ES-1p0_PPE/P0285/stats/JULES-ES-1p0_P0285_Annual_global.nc
Error in R_nc4_inq_varndims: NetCDF: Not a valid ID
Error in ncvar_ndims(ncid, varid) : error returned from C call
Error in R_nc4_close: NetCDF: Not a valid ID
Error in R_nc4_open: No such file or directory
Error in nc_open(paste0(fn)) : 
  Error in nc_open trying to open file /project/carbon_ppe/JULES-ES-1p0_PPE/P0357/stats/JULES-ES-1p0_P0357_Annual_global.nc
Error in R_nc4_inq_varndims: NetCDF: Not a valid ID
Error in ncvar_ndims(ncid, varid) : error returned from C call
Error in R_nc4_close: NetCDF: Not a valid ID
Error in R_nc4_open: No such file or directory
Error in nc_open(paste0(fn)) : 
  Error in nc_open trying to open file /project/carbon_ppe/JULES-ES-1p0_PPE/P0376/stats/JULES-ES-1p0_P0376_Annual_global.nc
Error in R_nc4_inq_varndims: NetCDF: Not a valid ID
Error in ncvar_ndims(ncid, varid) : error returned from C call
Error in R_nc4_close: NetCDF: Not a valid ID
Error in R_nc4_open: No such file or directory
Error in nc_open(paste0(fn)) : 
  Error in nc_open trying to open file /project/carbon_ppe/JULES-ES-1p0_PPE/P0387/stats/JULES-ES-1p0_P0387_Annual_global.nc
Error in R_nc4_inq_varndims: NetCDF: Not a valid ID
Error in ncvar_ndims(ncid, varid) : error returned from C call
Error in R_nc4_close: NetCDF: Not a valid ID
Error in R_nc4_open: No such file or directory
Error in nc_open(paste0(fn)) : 
  Error in nc_open trying to open file /project/carbon_ppe/JULES-ES-1p0_PPE/P0394/stats/JULES-ES-1p0_P0394_Annual_global.nc
Error in R_nc4_inq_varndims: NetCDF: Not a valid ID
Error in ncvar_ndims(ncid, varid) : error returned from C call
Error in R_nc4_close: NetCDF: Not a valid ID
Error in R_nc4_open: No such file or directory
Error in nc_open(paste0(fn)) : 
  Error in nc_open trying to open file /project/carbon_ppe/JULES-ES-1p0_PPE/P0405/stats/JULES-ES-1p0_P0405_Annual_global.nc
Error in R_nc4_inq_varndims: NetCDF: Not a valid ID
Error in ncvar_ndims(ncid, varid) : error returned from C call
Error in R_nc4_close: NetCDF: Not a valid ID
Error in R_nc4_open: No such file or directory
Error in nc_open(paste0(fn)) : 
  Error in nc_open trying to open file /project/carbon_ppe/JULES-ES-1p0_PPE/P0424/stats/JULES-ES-1p0_P0424_Annual_global.nc
Error in R_nc4_inq_varndims: NetCDF: Not a valid ID
Error in ncvar_ndims(ncid, varid) : error returned from C call
Error in R_nc4_close: NetCDF: Not a valid ID
Error in R_nc4_open: No such file or directory
Error in nc_open(paste0(fn)) : 
  Error in nc_open trying to open file /project/carbon_ppe/JULES-ES-1p0_PPE/P0455/stats/JULES-ES-1p0_P0455_Annual_global.nc
Error in R_nc4_inq_varndims: NetCDF: Not a valid ID
Error in ncvar_ndims(ncid, varid) : error returned from C call
Error in R_nc4_close: NetCDF: Not a valid ID
Error in R_nc4_open: No such file or directory
Error in nc_open(paste0(fn)) : 
  Error in nc_open trying to open file /project/carbon_ppe/JULES-ES-1p0_PPE/P0457/stats/JULES-ES-1p0_P0457_Annual_global.nc
Error in R_nc4_inq_varndims: NetCDF: Not a valid ID
Error in ncvar_ndims(ncid, varid) : error returned from C call
Error in R_nc4_close: NetCDF: Not a valid ID
Error in R_nc4_open: No such file or directory
Error in nc_open(paste0(fn)) : 
  Error in nc_open trying to open file /project/carbon_ppe/JULES-ES-1p0_PPE/P0069/stats/JULES-ES-1p0_P0069_Annual_global.nc
Error in R_nc4_inq_varndims: NetCDF: Not a valid ID
Error in ncvar_ndims(ncid, varid) : error returned from C call
Error in R_nc4_close: NetCDF: Not a valid ID
Error in R_nc4_open: No such file or directory
Error in nc_open(paste0(fn)) : 
  Error in nc_open trying to open file /project/carbon_ppe/JULES-ES-1p0_PPE/P0086/stats/JULES-ES-1p0_P0086_Annual_global.nc
Error in R_nc4_inq_varndims: NetCDF: Not a valid ID
Error in ncvar_ndims(ncid, varid) : error returned from C call
Error in R_nc4_close: NetCDF: Not a valid ID
Error in R_nc4_open: No such file or directory
Error in nc_open(paste0(fn)) : 
  Error in nc_open trying to open file /project/carbon_ppe/JULES-ES-1p0_PPE/P0144/stats/JULES-ES-1p0_P0144_Annual_global.nc
Error in R_nc4_inq_varndims: NetCDF: Not a valid ID
Error in ncvar_ndims(ncid, varid) : error returned from C call
Error in R_nc4_close: NetCDF: Not a valid ID
Error in R_nc4_open: No such file or directory
Error in nc_open(paste0(fn)) : 
  Error in nc_open trying to open file /project/carbon_ppe/JULES-ES-1p0_PPE/P0165/stats/JULES-ES-1p0_P0165_Annual_global.nc
Error in R_nc4_inq_varndims: NetCDF: Not a valid ID
Error in ncvar_ndims(ncid, varid) : error returned from C call
Error in R_nc4_close: NetCDF: Not a valid ID
Error in R_nc4_open: No such file or directory
Error in nc_open(paste0(fn)) : 
  Error in nc_open trying to open file /project/carbon_ppe/JULES-ES-1p0_PPE/P0168/stats/JULES-ES-1p0_P0168_Annual_global.nc
Error in R_nc4_inq_varndims: NetCDF: Not a valid ID
Error in ncvar_ndims(ncid, varid) : error returned from C call
Error in R_nc4_close: NetCDF: Not a valid ID
Error in R_nc4_open: No such file or directory
Error in nc_open(paste0(fn)) : 
  Error in nc_open trying to open file /project/carbon_ppe/JULES-ES-1p0_PPE/P0183/stats/JULES-ES-1p0_P0183_Annual_global.nc
Error in R_nc4_inq_varndims: NetCDF: Not a valid ID
Error in ncvar_ndims(ncid, varid) : error returned from C call
Error in R_nc4_close: NetCDF: Not a valid ID
Error in R_nc4_open: No such file or directory
Error in nc_open(paste0(fn)) : 
  Error in nc_open trying to open file /project/carbon_ppe/JULES-ES-1p0_PPE/P0185/stats/JULES-ES-1p0_P0185_Annual_global.nc
Error in R_nc4_inq_varndims: NetCDF: Not a valid ID
Error in ncvar_ndims(ncid, varid) : error returned from C call
Error in R_nc4_close: NetCDF: Not a valid ID
Error in R_nc4_open: No such file or directory
Error in nc_open(paste0(fn)) : 
  Error in nc_open trying to open file /project/carbon_ppe/JULES-ES-1p0_PPE/P0214/stats/JULES-ES-1p0_P0214_Annual_global.nc
Error in R_nc4_inq_varndims: NetCDF: Not a valid ID
Error in ncvar_ndims(ncid, varid) : error returned from C call
Error in R_nc4_close: NetCDF: Not a valid ID
Error in R_nc4_open: No such file or directory
Error in nc_open(paste0(fn)) : 
  Error in nc_open trying to open file /project/carbon_ppe/JULES-ES-1p0_PPE/P0216/stats/JULES-ES-1p0_P0216_Annual_global.nc
Error in R_nc4_inq_varndims: NetCDF: Not a valid ID
Error in ncvar_ndims(ncid, varid) : error returned from C call
Error in R_nc4_close: NetCDF: Not a valid ID
Error in R_nc4_open: No such file or directory
Error in nc_open(paste0(fn)) : 
  Error in nc_open trying to open file /project/carbon_ppe/JULES-ES-1p0_PPE/P0235/stats/JULES-ES-1p0_P0235_Annual_global.nc
Error in R_nc4_inq_varndims: NetCDF: Not a valid ID
Error in ncvar_ndims(ncid, varid) : error returned from C call
Error in R_nc4_close: NetCDF: Not a valid ID
Error in R_nc4_open: No such file or directory
Error in nc_open(paste0(fn)) : 
  Error in nc_open trying to open file /project/carbon_ppe/JULES-ES-1p0_PPE/P0238/stats/JULES-ES-1p0_P0238_Annual_global.nc
Error in R_nc4_inq_varndims: NetCDF: Not a valid ID
Error in ncvar_ndims(ncid, varid) : error returned from C call
Error in R_nc4_close: NetCDF: Not a valid ID
Error in R_nc4_open: No such file or directory
Error in nc_open(paste0(fn)) : 
  Error in nc_open trying to open file /project/carbon_ppe/JULES-ES-1p0_PPE/P0251/stats/JULES-ES-1p0_P0251_Annual_global.nc
Error in R_nc4_inq_varndims: NetCDF: Not a valid ID
Error in ncvar_ndims(ncid, varid) : error returned from C call
Error in R_nc4_close: NetCDF: Not a valid ID
Error in R_nc4_open: No such file or directory
Error in nc_open(paste0(fn)) : 
  Error in nc_open trying to open file /project/carbon_ppe/JULES-ES-1p0_PPE/P0259/stats/JULES-ES-1p0_P0259_Annual_global.nc
Error in R_nc4_inq_varndims: NetCDF: Not a valid ID
Error in ncvar_ndims(ncid, varid) : error returned from C call
Error in R_nc4_close: NetCDF: Not a valid ID
Error in R_nc4_open: No such file or directory
Error in nc_open(paste0(fn)) : 
  Error in nc_open trying to open file /project/carbon_ppe/JULES-ES-1p0_PPE/P0285/stats/JULES-ES-1p0_P0285_Annual_global.nc
Error in R_nc4_inq_varndims: NetCDF: Not a valid ID
Error in ncvar_ndims(ncid, varid) : error returned from C call
Error in R_nc4_close: NetCDF: Not a valid ID
Error in R_nc4_open: No such file or directory
Error in nc_open(paste0(fn)) : 
  Error in nc_open trying to open file /project/carbon_ppe/JULES-ES-1p0_PPE/P0357/stats/JULES-ES-1p0_P0357_Annual_global.nc
Error in R_nc4_inq_varndims: NetCDF: Not a valid ID
Error in ncvar_ndims(ncid, varid) : error returned from C call
Error in R_nc4_close: NetCDF: Not a valid ID
Error in R_nc4_open: No such file or directory
Error in nc_open(paste0(fn)) : 
  Error in nc_open trying to open file /project/carbon_ppe/JULES-ES-1p0_PPE/P0376/stats/JULES-ES-1p0_P0376_Annual_global.nc
Error in R_nc4_inq_varndims: NetCDF: Not a valid ID
Error in ncvar_ndims(ncid, varid) : error returned from C call
Error in R_nc4_close: NetCDF: Not a valid ID
Error in R_nc4_open: No such file or directory
Error in nc_open(paste0(fn)) : 
  Error in nc_open trying to open file /project/carbon_ppe/JULES-ES-1p0_PPE/P0387/stats/JULES-ES-1p0_P0387_Annual_global.nc
Error in R_nc4_inq_varndims: NetCDF: Not a valid ID
Error in ncvar_ndims(ncid, varid) : error returned from C call
Error in R_nc4_close: NetCDF: Not a valid ID
Error in R_nc4_open: No such file or directory
Error in nc_open(paste0(fn)) : 
  Error in nc_open trying to open file /project/carbon_ppe/JULES-ES-1p0_PPE/P0394/stats/JULES-ES-1p0_P0394_Annual_global.nc
Error in R_nc4_inq_varndims: NetCDF: Not a valid ID
Error in ncvar_ndims(ncid, varid) : error returned from C call
Error in R_nc4_close: NetCDF: Not a valid ID
Error in R_nc4_open: No such file or directory
Error in nc_open(paste0(fn)) : 
  Error in nc_open trying to open file /project/carbon_ppe/JULES-ES-1p0_PPE/P0405/stats/JULES-ES-1p0_P0405_Annual_global.nc
Error in R_nc4_inq_varndims: NetCDF: Not a valid ID
Error in ncvar_ndims(ncid, varid) : error returned from C call
Error in R_nc4_close: NetCDF: Not a valid ID
Error in R_nc4_open: No such file or directory
Error in nc_open(paste0(fn)) : 
  Error in nc_open trying to open file /project/carbon_ppe/JULES-ES-1p0_PPE/P0424/stats/JULES-ES-1p0_P0424_Annual_global.nc
Error in R_nc4_inq_varndims: NetCDF: Not a valid ID
Error in ncvar_ndims(ncid, varid) : error returned from C call
Error in R_nc4_close: NetCDF: Not a valid ID
Error in R_nc4_open: No such file or directory
Error in nc_open(paste0(fn)) : 
  Error in nc_open trying to open file /project/carbon_ppe/JULES-ES-1p0_PPE/P0455/stats/JULES-ES-1p0_P0455_Annual_global.nc
Error in R_nc4_inq_varndims: NetCDF: Not a valid ID
Error in ncvar_ndims(ncid, varid) : error returned from C call
Error in R_nc4_close: NetCDF: Not a valid ID
Error in R_nc4_open: No such file or directory
Error in nc_open(paste0(fn)) : 
  Error in nc_open trying to open file /project/carbon_ppe/JULES-ES-1p0_PPE/P0457/stats/JULES-ES-1p0_P0457_Annual_global.nc
Error in R_nc4_inq_varndims: NetCDF: Not a valid ID
Error in ncvar_ndims(ncid, varid) : error returned from C call
Error in R_nc4_close: NetCDF: Not a valid ID
Error in R_nc4_open: No such file or directory
Error in nc_open(paste0(fn)) : 
  Error in nc_open trying to open file /project/carbon_ppe/JULES-ES-1p0_PPE/P0069/stats/JULES-ES-1p0_P0069_Annual_global.nc
Error in R_nc4_inq_varndims: NetCDF: Not a valid ID
Error in ncvar_ndims(ncid, varid) : error returned from C call
Error in R_nc4_close: NetCDF: Not a valid ID
Error in R_nc4_open: No such file or directory
Error in nc_open(paste0(fn)) : 
  Error in nc_open trying to open file /project/carbon_ppe/JULES-ES-1p0_PPE/P0086/stats/JULES-ES-1p0_P0086_Annual_global.nc
Error in R_nc4_inq_varndims: NetCDF: Not a valid ID
Error in ncvar_ndims(ncid, varid) : error returned from C call
Error in R_nc4_close: NetCDF: Not a valid ID
Error in R_nc4_open: No such file or directory
Error in nc_open(paste0(fn)) : 
  Error in nc_open trying to open file /project/carbon_ppe/JULES-ES-1p0_PPE/P0144/stats/JULES-ES-1p0_P0144_Annual_global.nc
Error in R_nc4_inq_varndims: NetCDF: Not a valid ID
Error in ncvar_ndims(ncid, varid) : error returned from C call
Error in R_nc4_close: NetCDF: Not a valid ID
Error in R_nc4_open: No such file or directory
Error in nc_open(paste0(fn)) : 
  Error in nc_open trying to open file /project/carbon_ppe/JULES-ES-1p0_PPE/P0165/stats/JULES-ES-1p0_P0165_Annual_global.nc
Error in R_nc4_inq_varndims: NetCDF: Not a valid ID
Error in ncvar_ndims(ncid, varid) : error returned from C call
Error in R_nc4_close: NetCDF: Not a valid ID
Error in R_nc4_open: No such file or directory
Error in nc_open(paste0(fn)) : 
  Error in nc_open trying to open file /project/carbon_ppe/JULES-ES-1p0_PPE/P0168/stats/JULES-ES-1p0_P0168_Annual_global.nc
Error in R_nc4_inq_varndims: NetCDF: Not a valid ID
Error in ncvar_ndims(ncid, varid) : error returned from C call
Error in R_nc4_close: NetCDF: Not a valid ID
Error in R_nc4_open: No such file or directory
Error in nc_open(paste0(fn)) : 
  Error in nc_open trying to open file /project/carbon_ppe/JULES-ES-1p0_PPE/P0183/stats/JULES-ES-1p0_P0183_Annual_global.nc
Error in R_nc4_inq_varndims: NetCDF: Not a valid ID
Error in ncvar_ndims(ncid, varid) : error returned from C call
Error in R_nc4_close: NetCDF: Not a valid ID
Error in R_nc4_open: No such file or directory
Error in nc_open(paste0(fn)) : 
  Error in nc_open trying to open file /project/carbon_ppe/JULES-ES-1p0_PPE/P0185/stats/JULES-ES-1p0_P0185_Annual_global.nc
Error in R_nc4_inq_varndims: NetCDF: Not a valid ID
Error in ncvar_ndims(ncid, varid) : error returned from C call
Error in R_nc4_close: NetCDF: Not a valid ID
Error in R_nc4_open: No such file or directory
Error in nc_open(paste0(fn)) : 
  Error in nc_open trying to open file /project/carbon_ppe/JULES-ES-1p0_PPE/P0214/stats/JULES-ES-1p0_P0214_Annual_global.nc
Error in R_nc4_inq_varndims: NetCDF: Not a valid ID
Error in ncvar_ndims(ncid, varid) : error returned from C call
Error in R_nc4_close: NetCDF: Not a valid ID
Error in R_nc4_open: No such file or directory
Error in nc_open(paste0(fn)) : 
  Error in nc_open trying to open file /project/carbon_ppe/JULES-ES-1p0_PPE/P0216/stats/JULES-ES-1p0_P0216_Annual_global.nc
Error in R_nc4_inq_varndims: NetCDF: Not a valid ID
Error in ncvar_ndims(ncid, varid) : error returned from C call
Error in R_nc4_close: NetCDF: Not a valid ID
Error in R_nc4_open: No such file or directory
Error in nc_open(paste0(fn)) : 
  Error in nc_open trying to open file /project/carbon_ppe/JULES-ES-1p0_PPE/P0235/stats/JULES-ES-1p0_P0235_Annual_global.nc
Error in R_nc4_inq_varndims: NetCDF: Not a valid ID
Error in ncvar_ndims(ncid, varid) : error returned from C call
Error in R_nc4_close: NetCDF: Not a valid ID
Error in R_nc4_open: No such file or directory
Error in nc_open(paste0(fn)) : 
  Error in nc_open trying to open file /project/carbon_ppe/JULES-ES-1p0_PPE/P0238/stats/JULES-ES-1p0_P0238_Annual_global.nc
Error in R_nc4_inq_varndims: NetCDF: Not a valid ID
Error in ncvar_ndims(ncid, varid) : error returned from C call
Error in R_nc4_close: NetCDF: Not a valid ID
Error in R_nc4_open: No such file or directory
Error in nc_open(paste0(fn)) : 
  Error in nc_open trying to open file /project/carbon_ppe/JULES-ES-1p0_PPE/P0251/stats/JULES-ES-1p0_P0251_Annual_global.nc
Error in R_nc4_inq_varndims: NetCDF: Not a valid ID
Error in ncvar_ndims(ncid, varid) : error returned from C call
Error in R_nc4_close: NetCDF: Not a valid ID
Error in R_nc4_open: No such file or directory
Error in nc_open(paste0(fn)) : 
  Error in nc_open trying to open file /project/carbon_ppe/JULES-ES-1p0_PPE/P0259/stats/JULES-ES-1p0_P0259_Annual_global.nc
Error in R_nc4_inq_varndims: NetCDF: Not a valid ID
Error in ncvar_ndims(ncid, varid) : error returned from C call
Error in R_nc4_close: NetCDF: Not a valid ID
Error in R_nc4_open: No such file or directory
Error in nc_open(paste0(fn)) : 
  Error in nc_open trying to open file /project/carbon_ppe/JULES-ES-1p0_PPE/P0285/stats/JULES-ES-1p0_P0285_Annual_global.nc
Error in R_nc4_inq_varndims: NetCDF: Not a valid ID
Error in ncvar_ndims(ncid, varid) : error returned from C call
Error in R_nc4_close: NetCDF: Not a valid ID
Error in R_nc4_open: No such file or directory
Error in nc_open(paste0(fn)) : 
  Error in nc_open trying to open file /project/carbon_ppe/JULES-ES-1p0_PPE/P0357/stats/JULES-ES-1p0_P0357_Annual_global.nc
Error in R_nc4_inq_varndims: NetCDF: Not a valid ID
Error in ncvar_ndims(ncid, varid) : error returned from C call
Error in R_nc4_close: NetCDF: Not a valid ID
Error in R_nc4_open: No such file or directory
Error in nc_open(paste0(fn)) : 
  Error in nc_open trying to open file /project/carbon_ppe/JULES-ES-1p0_PPE/P0376/stats/JULES-ES-1p0_P0376_Annual_global.nc
Error in R_nc4_inq_varndims: NetCDF: Not a valid ID
Error in ncvar_ndims(ncid, varid) : error returned from C call
Error in R_nc4_close: NetCDF: Not a valid ID
Error in R_nc4_open: No such file or directory
Error in nc_open(paste0(fn)) : 
  Error in nc_open trying to open file /project/carbon_ppe/JULES-ES-1p0_PPE/P0387/stats/JULES-ES-1p0_P0387_Annual_global.nc
Error in R_nc4_inq_varndims: NetCDF: Not a valid ID
Error in ncvar_ndims(ncid, varid) : error returned from C call
Error in R_nc4_close: NetCDF: Not a valid ID
Error in R_nc4_open: No such file or directory
Error in nc_open(paste0(fn)) : 
  Error in nc_open trying to open file /project/carbon_ppe/JULES-ES-1p0_PPE/P0394/stats/JULES-ES-1p0_P0394_Annual_global.nc
Error in R_nc4_inq_varndims: NetCDF: Not a valid ID
Error in ncvar_ndims(ncid, varid) : error returned from C call
Error in R_nc4_close: NetCDF: Not a valid ID
Error in R_nc4_open: No such file or directory
Error in nc_open(paste0(fn)) : 
  Error in nc_open trying to open file /project/carbon_ppe/JULES-ES-1p0_PPE/P0405/stats/JULES-ES-1p0_P0405_Annual_global.nc
Error in R_nc4_inq_varndims: NetCDF: Not a valid ID
Error in ncvar_ndims(ncid, varid) : error returned from C call
Error in R_nc4_close: NetCDF: Not a valid ID
Error in R_nc4_open: No such file or directory
Error in nc_open(paste0(fn)) : 
  Error in nc_open trying to open file /project/carbon_ppe/JULES-ES-1p0_PPE/P0424/stats/JULES-ES-1p0_P0424_Annual_global.nc
Error in R_nc4_inq_varndims: NetCDF: Not a valid ID
Error in ncvar_ndims(ncid, varid) : error returned from C call
Error in R_nc4_close: NetCDF: Not a valid ID
Error in R_nc4_open: No such file or directory
Error in nc_open(paste0(fn)) : 
  Error in nc_open trying to open file /project/carbon_ppe/JULES-ES-1p0_PPE/P0455/stats/JULES-ES-1p0_P0455_Annual_global.nc
Error in R_nc4_inq_varndims: NetCDF: Not a valid ID
Error in ncvar_ndims(ncid, varid) : error returned from C call
Error in R_nc4_close: NetCDF: Not a valid ID
Error in R_nc4_open: No such file or directory
Error in nc_open(paste0(fn)) : 
  Error in nc_open trying to open file /project/carbon_ppe/JULES-ES-1p0_PPE/P0457/stats/JULES-ES-1p0_P0457_Annual_global.nc
Error in R_nc4_inq_varndims: NetCDF: Not a valid ID
Error in ncvar_ndims(ncid, varid) : error returned from C call
Error in R_nc4_close: NetCDF: Not a valid ID

1.11 Testing Gaussian Process emulators

1.11.1 NPP as a test

First, use mean NPP as an example. How does NPP respond to each parameter? NAs are removed, but zero values are still included.

1.12 Relationship between modern NPP and change since 1850.

Some outputs (e.g fLuc, fHarvest) have an almost perfect 1:1 relationship between modern value and change, some (nbp, npp, treeFrac) quite or moderately strong, and some (csoil, cveg) very weak or non-existant.

1.13 A clear threshold in the F0 parameter for NPP

It appears that this ensemble is less “clear cut” in having an output that clearly distinguishes between “failed” (or close to it), and “not failed”.

Having said that, having an F0 over a threshold seems to kill the carbon cycle, as before. Here, we’ve set a threshold of 0.9 (on the normalised scale) for F0, and we remove members of the ensemble with a larger F0 than that when we build emulators.

1.14 Level 1 constraint - remove ensemble members with F0 above threshold

The level 1 constraint removes any input with F0 greater than 0.9 (normalised), which removes many of the zero-carbon-cycle members up front. There are 424 ensmble members remaining.

This does constraint sequentially, which may not be a good idea.

[1] 2.410932e-09

1.14.1 Comparison of level 0 and level 1 emulators for NPP (modern value)

# Plot the regular km emulator. Doesn’t look great.

1.14.2 Leave-one-out summaries of NPP emulators


optimisation start
------------------
* estimation method   : MLE 
* optimisation method : BFGS 
* analytical gradient : used
* trend model : ~alpha_io + a_wl_io + bio_hum_cn + b_wl_io + dcatch_dlai_io + 
    dqcrit_io + dz0v_dh_io + f0_io + fd_io + g_area_io + g_root_io + 
    g_wood_io + gs_nvg_io + hw_sw_io + kaps_roth + knl_io + lai_max_io + 
    lai_min_io + lma_io + n_inorg_turnover + nmass_io + nr_io + 
    retran_l_io + retran_r_io + r_grow_io + rootd_ft_io + sigl_io + 
    sorp + tleaf_of_io + tlow_io + tupp_io + l_vg_soil
* covariance model : 
  - type :  matern5_2 
  - nugget : NO
  - parameters lower bounds :  1e-10 1e-10 1e-10 1e-10 1e-10 1e-10 1e-10 1e-10 1e-10 1e-10 1e-10 1e-10 1e-10 1e-10 1e-10 1e-10 1e-10 1e-10 1e-10 1e-10 1e-10 1e-10 1e-10 1e-10 1e-10 1e-10 1e-10 1e-10 1e-10 1e-10 1e-10 1e-10 
  - parameters upper bounds :  2 2 2 2 2 2 1.998154 1.997409 2 2 2 2 2 2 2 2 2 1.999201 2 1.996693 2 2 2 2 2 2 1.995643 1.998832 2 2 2 2 
  - best initial criterion value(s) :  -1842.508 

N = 32, M = 5 machine precision = 2.22045e-16
At X0, 0 variables are exactly at the bounds
At iterate     0  f=       1842.5  |proj g|=       1.8652
At iterate     1  f =       1841.3  |proj g|=        1.4365
At iterate     2  f =       1839.3  |proj g|=        1.8697
At iterate     3  f =         1839  |proj g|=        1.8947
At iterate     4  f =         1839  |proj g|=        1.2143
At iterate     5  f =       1838.6  |proj g|=        1.1891
At iterate     6  f =       1838.3  |proj g|=        1.9015
At iterate     7  f =       1837.6  |proj g|=         1.871
At iterate     8  f =         1837  |proj g|=        1.8711
At iterate     9  f =       1834.9  |proj g|=        1.7796
At iterate    10  f =         1833  |proj g|=        1.8503
At iterate    11  f =       1831.1  |proj g|=        1.8644
At iterate    12  f =       1830.9  |proj g|=        1.8531
At iterate    13  f =       1829.9  |proj g|=        1.8044
At iterate    14  f =       1828.8  |proj g|=        1.8322
At iterate    15  f =       1827.7  |proj g|=        1.8111
At iterate    16  f =       1825.8  |proj g|=        1.8566
At iterate    17  f =       1822.1  |proj g|=        1.8783
At iterate    18  f =       1817.9  |proj g|=        1.8192
At iterate    19  f =         1810  |proj g|=        1.8972
At iterate    20  f =       1807.7  |proj g|=        1.3523
At iterate    21  f =       1806.7  |proj g|=        1.3328
At iterate    22  f =       1804.9  |proj g|=        1.8829
At iterate    23  f =       1803.2  |proj g|=        1.6989
At iterate    24  f =       1802.4  |proj g|=        1.7693
At iterate    25  f =       1801.2  |proj g|=        1.8451
At iterate    26  f =       1799.8  |proj g|=        1.8602
At iterate    27  f =       1799.5  |proj g|=        1.6174
At iterate    28  f =       1799.2  |proj g|=        1.5947
At iterate    29  f =       1798.8  |proj g|=        1.5503
At iterate    30  f =       1796.6  |proj g|=        1.8546
At iterate    31  f =       1795.7  |proj g|=         1.586
At iterate    32  f =       1795.4  |proj g|=         1.583
At iterate    33  f =       1795.3  |proj g|=        1.6047
At iterate    34  f =       1793.7  |proj g|=        1.5063
At iterate    35  f =       1793.4  |proj g|=        1.4599
At iterate    36  f =       1793.2  |proj g|=        1.8832
At iterate    37  f =         1793  |proj g|=          1.87
At iterate    38  f =       1792.9  |proj g|=        1.4333
At iterate    39  f =       1792.4  |proj g|=        1.6437
At iterate    40  f =       1792.1  |proj g|=        1.3598
At iterate    41  f =       1791.8  |proj g|=        1.8392
At iterate    42  f =       1791.2  |proj g|=        1.8717
At iterate    43  f =       1790.7  |proj g|=        1.8739
At iterate    44  f =       1790.5  |proj g|=        1.0022
At iterate    45  f =       1790.4  |proj g|=        1.1185
At iterate    46  f =       1790.3  |proj g|=        1.8759
At iterate    47  f =       1790.3  |proj g|=         1.875
At iterate    48  f =       1790.2  |proj g|=        1.8727
At iterate    49  f =       1790.1  |proj g|=         1.802
At iterate    50  f =       1790.1  |proj g|=       0.81547
At iterate    51  f =       1790.1  |proj g|=        0.8373
At iterate    52  f =         1790  |proj g|=        1.8728
At iterate    53  f =       1789.8  |proj g|=       0.93276
At iterate    54  f =       1789.8  |proj g|=        1.8773
At iterate    55  f =       1789.7  |proj g|=        1.8754
At iterate    56  f =       1789.7  |proj g|=        1.5203
At iterate    57  f =       1789.6  |proj g|=        1.2658
At iterate    58  f =       1789.6  |proj g|=       0.92604
At iterate    59  f =       1789.2  |proj g|=         1.876
At iterate    60  f =       1789.2  |proj g|=         1.873
At iterate    61  f =       1789.1  |proj g|=       0.80926
At iterate    62  f =       1789.1  |proj g|=       0.63617
At iterate    63  f =       1789.1  |proj g|=        1.7888
At iterate    64  f =         1789  |proj g|=         1.873
At iterate    65  f =         1789  |proj g|=        1.4746
At iterate    66  f =         1789  |proj g|=       0.71729
At iterate    67  f =         1789  |proj g|=       0.71538
At iterate    68  f =         1789  |proj g|=       0.70747
At iterate    69  f =         1789  |proj g|=       0.63382
At iterate    70  f =       1788.9  |proj g|=       0.74475
At iterate    71  f =       1788.9  |proj g|=        1.7914
At iterate    72  f =       1788.9  |proj g|=       0.95343
At iterate    73  f =       1788.8  |proj g|=       0.85278
At iterate    74  f =       1788.8  |proj g|=       0.74093
At iterate    75  f =       1788.8  |proj g|=       0.90557
At iterate    76  f =       1788.8  |proj g|=       0.29949
At iterate    77  f =       1788.8  |proj g|=       0.28806
At iterate    78  f =       1788.8  |proj g|=       0.27628
At iterate    79  f =       1788.8  |proj g|=       0.55663
At iterate    80  f =       1788.8  |proj g|=        1.7132
At iterate    81  f =       1788.8  |proj g|=        1.8713
At iterate    82  f =       1788.8  |proj g|=        1.8716
At iterate    83  f =       1788.8  |proj g|=        1.8729
At iterate    84  f =       1788.8  |proj g|=       0.83666
At iterate    85  f =       1788.8  |proj g|=       0.30137
At iterate    86  f =       1788.7  |proj g|=       0.31882
At iterate    87  f =       1788.7  |proj g|=        0.2255
At iterate    88  f =       1788.7  |proj g|=       0.42148
At iterate    89  f =       1788.7  |proj g|=       0.59752
At iterate    90  f =       1788.7  |proj g|=       0.51451
At iterate    91  f =       1788.7  |proj g|=        1.4762
At iterate    92  f =       1788.7  |proj g|=       0.69297
At iterate    93  f =       1788.7  |proj g|=       0.53596
At iterate    94  f =       1788.7  |proj g|=        0.5359
At iterate    95  f =       1788.7  |proj g|=       0.55123
At iterate    96  f =       1788.7  |proj g|=       0.37871
At iterate    97  f =       1788.7  |proj g|=       0.31548
At iterate    98  f =       1788.7  |proj g|=       0.23863
At iterate    99  f =       1788.7  |proj g|=       0.13991
At iterate   100  f =       1788.7  |proj g|=       0.13728
At iterate   101  f =       1788.7  |proj g|=       0.14306
final  value 1788.683595 
stopped after 101 iterations

optimisation start
------------------
* estimation method   : MLE 
* optimisation method : BFGS 
* analytical gradient : used
* trend model : ~alpha_io + a_wl_io + bio_hum_cn + b_wl_io + dcatch_dlai_io + 
    dqcrit_io + dz0v_dh_io + f0_io + fd_io + g_area_io + g_root_io + 
    g_wood_io + gs_nvg_io + hw_sw_io + kaps_roth + knl_io + lai_max_io + 
    lai_min_io + lma_io + n_inorg_turnover + nmass_io + nr_io + 
    retran_l_io + retran_r_io + r_grow_io + rootd_ft_io + sigl_io + 
    sorp + tleaf_of_io + tlow_io + tupp_io + l_vg_soil
* covariance model : 
  - type :  matern5_2 
  - nugget : NO
  - parameters lower bounds :  1e-10 1e-10 1e-10 1e-10 1e-10 1e-10 1e-10 1e-10 1e-10 1e-10 1e-10 1e-10 1e-10 1e-10 1e-10 1e-10 1e-10 1e-10 1e-10 1e-10 1e-10 1e-10 1e-10 1e-10 1e-10 1e-10 1e-10 1e-10 1e-10 1e-10 1e-10 1e-10 
  - parameters upper bounds :  2 2 1.999244 2 1.995574 2 1.998154 1.790352 2 2 2 1.998084 2 2 2 2 2 1.999201 2 1.996693 1.998361 2 2 1.995738 2 1.993455 1.995643 1.998832 2 2 2 2 
  - best initial criterion value(s) :  -6192.077 

N = 32, M = 5 machine precision = 2.22045e-16
At X0, 0 variables are exactly at the bounds
At iterate     0  f=       6192.1  |proj g|=       1.7779
At iterate     1  f =       6097.2  |proj g|=        1.9547
At iterate     2  f =       6092.5  |proj g|=        1.9408
At iterate     3  f =       6091.7  |proj g|=          1.94
At iterate     4  f =       6089.5  |proj g|=        1.9104
At iterate     5  f =       6081.3  |proj g|=        1.9157
At iterate     6  f =       6077.6  |proj g|=        1.9116
At iterate     7  f =       6074.3  |proj g|=         1.907
At iterate     8  f =       6073.6  |proj g|=        1.9049
At iterate     9  f =       6071.5  |proj g|=        1.8255
At iterate    10  f =         6066  |proj g|=        1.7837
At iterate    11  f =       6065.2  |proj g|=        1.7673
At iterate    12  f =       6063.4  |proj g|=         1.752
At iterate    13  f =       6062.6  |proj g|=        1.9208
At iterate    14  f =       6062.1  |proj g|=        1.7448
At iterate    15  f =         6062  |proj g|=        1.7437
At iterate    16  f =       6061.8  |proj g|=        1.7402
At iterate    17  f =         6061  |proj g|=        1.7269
At iterate    18  f =       6060.1  |proj g|=        1.7134
ys=-1.254e-02  -gs= 8.259e-01, BFGS update SKIPPED
At iterate    19  f =       6059.6  |proj g|=        1.7043
ys=-2.746e-03  -gs= 5.566e-01, BFGS update SKIPPED
At iterate    20  f =       6059.3  |proj g|=        1.7005
At iterate    21  f =       6056.3  |proj g|=        1.9169
At iterate    22  f =       6055.7  |proj g|=        1.9087
At iterate    23  f =       6055.4  |proj g|=        1.8996
At iterate    24  f =       6055.1  |proj g|=        1.6244
At iterate    25  f =       6054.9  |proj g|=        1.8958
At iterate    26  f =       6054.6  |proj g|=        1.6078
At iterate    27  f =       6054.3  |proj g|=        1.5928
At iterate    28  f =       6053.9  |proj g|=        1.8949
At iterate    29  f =       6053.8  |proj g|=        1.8942
At iterate    30  f =       6053.7  |proj g|=        1.5209
At iterate    31  f =       6053.7  |proj g|=         1.516
At iterate    32  f =       6053.3  |proj g|=        1.8931
At iterate    33  f =       6052.9  |proj g|=        1.3806
At iterate    34  f =       6052.8  |proj g|=        1.3433
At iterate    35  f =         6052  |proj g|=        1.8927
At iterate    36  f =       6051.9  |proj g|=        1.3527
At iterate    37  f =       6051.9  |proj g|=        1.0531
At iterate    38  f =       6051.8  |proj g|=       0.96661
At iterate    39  f =       6051.8  |proj g|=       0.97303
At iterate    40  f =       6051.8  |proj g|=       0.62567
At iterate    41  f =       6051.7  |proj g|=       0.68667
At iterate    42  f =       6051.7  |proj g|=        1.0212
At iterate    43  f =       6051.7  |proj g|=       0.36663
At iterate    44  f =       6051.7  |proj g|=       0.20017
At iterate    45  f =       6051.7  |proj g|=       0.20136
At iterate    46  f =       6051.7  |proj g|=        0.1629
At iterate    47  f =       6051.7  |proj g|=       0.21978
At iterate    48  f =       6051.7  |proj g|=       0.23363
At iterate    49  f =       6051.7  |proj g|=       0.17448
At iterate    50  f =       6051.7  |proj g|=      0.091728
At iterate    51  f =       6051.7  |proj g|=      0.097416
At iterate    52  f =       6051.7  |proj g|=       0.12446
At iterate    53  f =       6051.7  |proj g|=       0.07705
At iterate    54  f =       6051.7  |proj g|=       0.11677
At iterate    55  f =       6051.7  |proj g|=       0.20318
At iterate    56  f =       6051.7  |proj g|=      0.094594
At iterate    57  f =       6051.7  |proj g|=       0.11668
At iterate    58  f =       6051.7  |proj g|=       0.03121
At iterate    59  f =       6051.7  |proj g|=      0.055344
At iterate    60  f =       6051.7  |proj g|=       0.11291
At iterate    61  f =       6051.7  |proj g|=      0.066099
At iterate    62  f =       6051.7  |proj g|=      0.078269

iterations 62
function evaluations 76
segments explored during Cauchy searches 76
BFGS updates skipped 2
active bounds at final generalized Cauchy point 25
norm of the final projected gradient 0.0782694
final function value 6051.72

F = 6051.72
final  value 6051.720344 
converged

optimisation start
------------------
* estimation method   : MLE 
* optimisation method : BFGS 
* analytical gradient : used
* trend model : ~alpha_io + a_wl_io + bio_hum_cn + b_wl_io + dcatch_dlai_io + 
    dqcrit_io + dz0v_dh_io + f0_io + fd_io + g_area_io + g_root_io + 
    g_wood_io + gs_nvg_io + hw_sw_io + kaps_roth + knl_io + lai_max_io + 
    lai_min_io + lma_io + n_inorg_turnover + nmass_io + nr_io + 
    retran_l_io + retran_r_io + r_grow_io + rootd_ft_io + sigl_io + 
    sorp + tleaf_of_io + tlow_io + tupp_io + l_vg_soil
* covariance model : 
  - type :  matern5_2 
  - nugget : NO
  - parameters lower bounds :  1e-10 1e-10 1e-10 1e-10 1e-10 1e-10 1e-10 1e-10 1e-10 1e-10 1e-10 1e-10 1e-10 1e-10 1e-10 1e-10 1e-10 1e-10 1e-10 1e-10 1e-10 1e-10 1e-10 1e-10 1e-10 1e-10 1e-10 1e-10 1e-10 1e-10 1e-10 1e-10 
  - parameters upper bounds :  2 2 2 2 2 2 1.998154 1.997409 2 2 2 2 2 2 2 2 2 1.999201 2 1.996693 2 2 2 2 2 2 1.995643 1.998832 2 2 2 2 
  - best initial criterion value(s) :  -1844.124 -1844.169 -1844.496 -1844.519 

N = 32, M = 5 machine precision = 2.22045e-16
At X0, 0 variables are exactly at the bounds
At iterate     0  f=       1844.1  |proj g|=       1.9783
At iterate     1  f =       1827.3  |proj g|=        1.5081
At iterate     2  f =       1810.4  |proj g|=        1.9257
At iterate     3  f =       1810.1  |proj g|=        1.2762
At iterate     4  f =       1808.6  |proj g|=        1.9155
At iterate     5  f =       1803.8  |proj g|=        1.9384
At iterate     6  f =       1802.5  |proj g|=        1.9352
At iterate     7  f =       1801.9  |proj g|=        1.9195
At iterate     8  f =       1801.3  |proj g|=        1.5673
At iterate     9  f =         1801  |proj g|=        1.5746
At iterate    10  f =       1800.3  |proj g|=        1.5734
At iterate    11  f =         1800  |proj g|=        1.5698
At iterate    12  f =       1799.2  |proj g|=        1.9053
At iterate    13  f =         1799  |proj g|=        1.9022
At iterate    14  f =       1798.9  |proj g|=        1.2078
At iterate    15  f =       1798.9  |proj g|=        1.2015
At iterate    16  f =       1798.8  |proj g|=        1.4287
At iterate    17  f =       1798.3  |proj g|=        1.9001
At iterate    18  f =       1797.6  |proj g|=        1.8921
At iterate    19  f =       1796.9  |proj g|=        1.8927
At iterate    20  f =       1796.5  |proj g|=        0.9502
At iterate    21  f =       1795.9  |proj g|=        1.2526
At iterate    22  f =       1795.6  |proj g|=        1.8954
At iterate    23  f =       1795.4  |proj g|=        1.5256
At iterate    24  f =       1794.9  |proj g|=        1.8901
At iterate    25  f =       1794.7  |proj g|=        1.5025
At iterate    26  f =       1793.9  |proj g|=        1.3057
At iterate    27  f =       1793.7  |proj g|=        1.3204
At iterate    28  f =       1793.5  |proj g|=        1.4504
At iterate    29  f =       1793.4  |proj g|=        1.2978
At iterate    30  f =       1793.3  |proj g|=        1.2918
At iterate    31  f =       1793.1  |proj g|=        1.8873
At iterate    32  f =       1792.8  |proj g|=        1.8811
At iterate    33  f =       1792.6  |proj g|=        1.8802
At iterate    34  f =       1792.2  |proj g|=        1.7755
At iterate    35  f =       1791.9  |proj g|=        1.7764
At iterate    36  f =       1790.9  |proj g|=        1.7796
At iterate    37  f =       1790.8  |proj g|=        1.8808
At iterate    38  f =       1790.7  |proj g|=        1.2525
At iterate    39  f =       1790.7  |proj g|=       0.78214
At iterate    40  f =       1790.4  |proj g|=       0.82047
At iterate    41  f =       1790.3  |proj g|=        1.0794
At iterate    42  f =       1790.2  |proj g|=        1.3994
At iterate    43  f =       1790.1  |proj g|=        1.8787
At iterate    44  f =       1789.9  |proj g|=        1.2268
At iterate    45  f =       1789.9  |proj g|=       0.90265
At iterate    46  f =       1789.8  |proj g|=        1.8777
At iterate    47  f =       1789.8  |proj g|=        1.8783
At iterate    48  f =       1789.7  |proj g|=        1.5976
At iterate    49  f =       1789.7  |proj g|=       0.96825
At iterate    50  f =       1789.7  |proj g|=        1.7855
At iterate    51  f =       1789.5  |proj g|=        1.7958
At iterate    52  f =       1789.4  |proj g|=        1.7966
At iterate    53  f =       1789.4  |proj g|=        1.7892
At iterate    54  f =       1789.2  |proj g|=        1.7826
At iterate    55  f =       1789.2  |proj g|=         1.194
At iterate    56  f =       1789.2  |proj g|=        1.1932
At iterate    57  f =       1789.1  |proj g|=        1.1212
At iterate    58  f =         1789  |proj g|=        1.1135
At iterate    59  f =         1789  |proj g|=         1.875
At iterate    60  f =         1789  |proj g|=        1.7381
At iterate    61  f =       1788.9  |proj g|=        1.4756
At iterate    62  f =       1788.9  |proj g|=        1.7829
At iterate    63  f =       1788.8  |proj g|=        1.7807
At iterate    64  f =       1788.8  |proj g|=        1.7842
At iterate    65  f =       1788.8  |proj g|=       0.55799
At iterate    66  f =       1788.8  |proj g|=       0.54893
At iterate    67  f =       1788.8  |proj g|=         1.162
At iterate    68  f =       1788.8  |proj g|=        1.8723
At iterate    69  f =       1788.8  |proj g|=        1.0113
At iterate    70  f =       1788.8  |proj g|=       0.42081
At iterate    71  f =       1788.8  |proj g|=       0.40831
At iterate    72  f =       1788.8  |proj g|=       0.37755
At iterate    73  f =       1788.7  |proj g|=       0.55045
At iterate    74  f =       1788.7  |proj g|=        1.8706
At iterate    75  f =       1788.7  |proj g|=       0.62034
At iterate    76  f =       1788.7  |proj g|=       0.32525
At iterate    77  f =       1788.7  |proj g|=       0.30756
At iterate    78  f =       1788.7  |proj g|=       0.39267
At iterate    79  f =       1788.7  |proj g|=       0.63073
At iterate    80  f =       1788.7  |proj g|=       0.54849
At iterate    81  f =       1788.7  |proj g|=       0.37813
At iterate    82  f =       1788.7  |proj g|=       0.28969
At iterate    83  f =       1788.7  |proj g|=       0.40478
At iterate    84  f =       1788.7  |proj g|=        0.5533
At iterate    85  f =       1788.7  |proj g|=       0.68968
At iterate    86  f =       1788.7  |proj g|=        1.2444
At iterate    87  f =       1788.7  |proj g|=      0.099835
At iterate    88  f =       1788.7  |proj g|=      0.099618
At iterate    89  f =       1788.7  |proj g|=        0.1305
At iterate    90  f =       1788.7  |proj g|=       0.13061
At iterate    91  f =       1788.7  |proj g|=       0.47715
At iterate    92  f =       1788.7  |proj g|=       0.21897
At iterate    93  f =       1788.7  |proj g|=        0.1916
At iterate    94  f =       1788.7  |proj g|=       0.22821
At iterate    95  f =       1788.7  |proj g|=        1.0767
At iterate    96  f =       1788.7  |proj g|=        0.3527
At iterate    97  f =       1788.7  |proj g|=       0.33189
At iterate    98  f =       1788.7  |proj g|=       0.21486
At iterate    99  f =       1788.7  |proj g|=        0.1876
At iterate   100  f =       1788.7  |proj g|=       0.22777
At iterate   101  f =       1788.7  |proj g|=       0.53975
final  value 1788.683283 
stopped after 101 iterations
N = 32, M = 5 machine precision = 2.22045e-16
At X0, 0 variables are exactly at the bounds
At iterate     0  f=       1844.2  |proj g|=        1.901
At iterate     1  f =       1829.2  |proj g|=        1.7095
At iterate     2  f =       1826.3  |proj g|=        1.7222
At iterate     3  f =       1817.4  |proj g|=        1.8951
At iterate     4  f =       1810.3  |proj g|=        1.9269
At iterate     5  f =       1809.7  |proj g|=        1.3481
At iterate     6  f =       1808.7  |proj g|=        1.3548
At iterate     7  f =       1807.2  |proj g|=        1.9013
At iterate     8  f =       1805.9  |proj g|=        1.9149
At iterate     9  f =       1805.4  |proj g|=        1.8995
At iterate    10  f =       1803.8  |proj g|=        1.1077
At iterate    11  f =       1803.5  |proj g|=        1.9043
At iterate    12  f =       1803.4  |proj g|=        1.0665
At iterate    13  f =       1802.9  |proj g|=        1.9108
At iterate    14  f =       1802.7  |proj g|=        1.0578
At iterate    15  f =       1801.1  |proj g|=        1.9175
At iterate    16  f =       1800.8  |proj g|=        1.6693
At iterate    17  f =       1800.1  |proj g|=        1.6028
At iterate    18  f =       1799.4  |proj g|=        1.9058
At iterate    19  f =         1798  |proj g|=        1.8989
At iterate    20  f =       1797.2  |proj g|=       0.94213
At iterate    21  f =       1796.9  |proj g|=        1.8982
At iterate    22  f =       1796.3  |proj g|=        1.3185
At iterate    23  f =       1794.8  |proj g|=         1.524
At iterate    24  f =       1794.4  |proj g|=        1.5174
At iterate    25  f =       1793.8  |proj g|=        1.8934
At iterate    26  f =       1793.7  |proj g|=        1.8903
At iterate    27  f =       1793.6  |proj g|=        1.4863
At iterate    28  f =       1793.4  |proj g|=        1.4153
At iterate    29  f =       1793.3  |proj g|=        1.6275
At iterate    30  f =       1793.1  |proj g|=        1.7603
At iterate    31  f =       1792.9  |proj g|=        1.8829
At iterate    32  f =       1792.7  |proj g|=        1.8851
At iterate    33  f =       1792.5  |proj g|=        1.7591
At iterate    34  f =       1792.4  |proj g|=       0.74821
At iterate    35  f =         1792  |proj g|=       0.67033
At iterate    36  f =       1791.2  |proj g|=       0.88902
At iterate    37  f =         1791  |proj g|=        1.8859
At iterate    38  f =       1790.9  |proj g|=        0.8918
At iterate    39  f =       1790.9  |proj g|=         1.885
At iterate    40  f =       1790.9  |proj g|=       0.89031
At iterate    41  f =       1790.8  |proj g|=       0.88962
At iterate    42  f =       1790.8  |proj g|=         1.884
At iterate    43  f =       1790.7  |proj g|=        1.6486
At iterate    44  f =       1790.7  |proj g|=       0.87749
At iterate    45  f =       1790.5  |proj g|=       0.87374
At iterate    46  f =       1790.2  |proj g|=       0.92403
At iterate    47  f =         1790  |proj g|=       0.89554
At iterate    48  f =       1789.9  |proj g|=       0.85871
At iterate    49  f =       1789.8  |proj g|=       0.81672
At iterate    50  f =       1789.8  |proj g|=        1.7848
At iterate    51  f =       1789.8  |proj g|=        1.7893
At iterate    52  f =       1789.7  |proj g|=        1.7884
At iterate    53  f =       1789.7  |proj g|=       0.75862
At iterate    54  f =       1789.7  |proj g|=        0.7675
At iterate    55  f =       1789.6  |proj g|=       0.77272
At iterate    56  f =       1789.5  |proj g|=        1.8809
At iterate    57  f =       1789.4  |proj g|=       0.51739
At iterate    58  f =       1789.3  |proj g|=        1.8875
At iterate    59  f =       1789.2  |proj g|=        1.8826
At iterate    60  f =       1789.2  |proj g|=        1.7779
At iterate    61  f =       1789.2  |proj g|=        1.3471
At iterate    62  f =       1789.1  |proj g|=       0.54392
At iterate    63  f =       1789.1  |proj g|=       0.86088
At iterate    64  f =       1789.1  |proj g|=        1.8811
At iterate    65  f =       1789.1  |proj g|=        1.8811
At iterate    66  f =         1789  |proj g|=        1.8798
At iterate    67  f =       1788.9  |proj g|=        1.8743
At iterate    68  f =       1788.9  |proj g|=       0.80123
At iterate    69  f =       1788.9  |proj g|=       0.78927
At iterate    70  f =       1788.8  |proj g|=        1.8759
At iterate    71  f =       1788.8  |proj g|=       0.71153
At iterate    72  f =       1788.7  |proj g|=       0.52376
At iterate    73  f =       1788.7  |proj g|=       0.37546
At iterate    74  f =       1788.7  |proj g|=       0.32805
At iterate    75  f =       1788.7  |proj g|=       0.31573
At iterate    76  f =       1788.7  |proj g|=       0.29298
At iterate    77  f =       1788.7  |proj g|=        1.8724
At iterate    78  f =       1788.7  |proj g|=       0.77072
At iterate    79  f =       1788.7  |proj g|=       0.42465
At iterate    80  f =       1788.7  |proj g|=       0.30258
At iterate    81  f =       1788.7  |proj g|=       0.55782
At iterate    82  f =       1788.7  |proj g|=       0.59316
At iterate    83  f =       1788.7  |proj g|=       0.61489
At iterate    84  f =       1788.7  |proj g|=       0.50715
At iterate    85  f =       1788.7  |proj g|=       0.16702
At iterate    86  f =       1788.7  |proj g|=       0.28302
At iterate    87  f =       1788.7  |proj g|=       0.33463
At iterate    88  f =       1788.7  |proj g|=       0.67044
At iterate    89  f =       1788.7  |proj g|=       0.66924
At iterate    90  f =       1788.7  |proj g|=       0.21373
At iterate    91  f =       1788.7  |proj g|=       0.21343
At iterate    92  f =       1788.7  |proj g|=       0.12906
At iterate    93  f =       1788.7  |proj g|=       0.23661
At iterate    94  f =       1788.7  |proj g|=       0.15096
At iterate    95  f =       1788.7  |proj g|=      0.074849
At iterate    96  f =       1788.7  |proj g|=      0.089774
At iterate    97  f =       1788.7  |proj g|=       0.15525
At iterate    98  f =       1788.7  |proj g|=       0.20395
At iterate    99  f =       1788.7  |proj g|=       0.19495
At iterate   100  f =       1788.7  |proj g|=       0.12942
At iterate   101  f =       1788.7  |proj g|=       0.12935
final  value 1788.682106 
stopped after 101 iterations
N = 32, M = 5 machine precision = 2.22045e-16
At X0, 0 variables are exactly at the bounds
At iterate     0  f=       1844.5  |proj g|=       1.8965
At iterate     1  f =       1837.2  |proj g|=        1.4588
At iterate     2  f =       1830.9  |proj g|=        1.6454
ys=-1.833e-01  -gs= 5.897e+00, BFGS update SKIPPED
At iterate     3  f =       1824.7  |proj g|=        1.8975
At iterate     4  f =       1821.1  |proj g|=        1.8605
ys=-6.464e-01  -gs= 3.354e+00, BFGS update SKIPPED
At iterate     5  f =         1815  |proj g|=        1.9047
At iterate     6  f =       1810.3  |proj g|=        1.8804
At iterate     7  f =       1809.5  |proj g|=        1.5698
At iterate     8  f =       1808.6  |proj g|=        1.8781
At iterate     9  f =         1808  |proj g|=        1.8382
At iterate    10  f =       1807.5  |proj g|=         1.657
At iterate    11  f =       1806.9  |proj g|=        1.8304
At iterate    12  f =       1806.3  |proj g|=        1.8426
At iterate    13  f =       1804.9  |proj g|=        1.8294
At iterate    14  f =       1804.6  |proj g|=        1.6177
At iterate    15  f =       1804.3  |proj g|=        1.5993
At iterate    16  f =       1804.1  |proj g|=         1.853
At iterate    17  f =       1803.7  |proj g|=         1.568
At iterate    18  f =       1803.5  |proj g|=        1.8548
At iterate    19  f =       1798.5  |proj g|=        1.8698
At iterate    20  f =         1798  |proj g|=        1.5165
At iterate    21  f =       1796.5  |proj g|=        1.8676
At iterate    22  f =       1796.4  |proj g|=        1.5568
At iterate    23  f =       1796.2  |proj g|=        1.5642
At iterate    24  f =       1793.6  |proj g|=        1.5362
At iterate    25  f =       1793.3  |proj g|=        1.8045
At iterate    26  f =       1793.1  |proj g|=        1.8804
At iterate    27  f =       1792.9  |proj g|=        1.8841
At iterate    28  f =       1792.6  |proj g|=        1.8834
At iterate    29  f =         1792  |proj g|=        1.4467
At iterate    30  f =       1791.8  |proj g|=        1.2888
At iterate    31  f =       1790.9  |proj g|=        1.8787
At iterate    32  f =       1790.7  |proj g|=        1.0173
At iterate    33  f =       1790.5  |proj g|=       0.98947
At iterate    34  f =       1790.1  |proj g|=        1.8805
At iterate    35  f =         1790  |proj g|=        1.4888
At iterate    36  f =         1790  |proj g|=       0.70684
At iterate    37  f =         1790  |proj g|=       0.91985
At iterate    38  f =         1790  |proj g|=        1.6393
At iterate    39  f =       1789.8  |proj g|=         1.882
At iterate    40  f =       1789.7  |proj g|=         1.881
At iterate    41  f =       1789.6  |proj g|=        1.8776
At iterate    42  f =       1789.6  |proj g|=       0.76916
At iterate    43  f =       1789.5  |proj g|=       0.71971
At iterate    44  f =       1789.5  |proj g|=        1.1675
At iterate    45  f =       1789.5  |proj g|=        1.6044
At iterate    46  f =       1789.4  |proj g|=        1.8782
At iterate    47  f =       1789.2  |proj g|=        1.8816
At iterate    48  f =       1789.2  |proj g|=         1.801
At iterate    49  f =       1789.1  |proj g|=        1.7905
At iterate    50  f =       1789.1  |proj g|=       0.92407
At iterate    51  f =       1789.1  |proj g|=       0.83788
At iterate    52  f =         1789  |proj g|=       0.77994
At iterate    53  f =         1789  |proj g|=       0.60603
At iterate    54  f =       1788.9  |proj g|=        0.5705
At iterate    55  f =       1788.9  |proj g|=        1.8185
At iterate    56  f =       1788.9  |proj g|=        1.0668
At iterate    57  f =       1788.9  |proj g|=        1.0849
At iterate    58  f =       1788.9  |proj g|=       0.99779
At iterate    59  f =       1788.8  |proj g|=       0.30721
At iterate    60  f =       1788.8  |proj g|=       0.24539
At iterate    61  f =       1788.8  |proj g|=        1.0934
At iterate    62  f =       1788.8  |proj g|=        1.1857
At iterate    63  f =       1788.8  |proj g|=       0.40884
At iterate    64  f =       1788.8  |proj g|=       0.35038
At iterate    65  f =       1788.8  |proj g|=       0.57915
At iterate    66  f =       1788.8  |proj g|=       0.55331
At iterate    67  f =       1788.8  |proj g|=       0.75052
At iterate    68  f =       1788.7  |proj g|=       0.99308
At iterate    69  f =       1788.7  |proj g|=        1.7903
At iterate    70  f =       1788.7  |proj g|=       0.57204
At iterate    71  f =       1788.7  |proj g|=       0.30753
At iterate    72  f =       1788.7  |proj g|=       0.40401
At iterate    73  f =       1788.7  |proj g|=        1.4657
At iterate    74  f =       1788.7  |proj g|=       0.55761
At iterate    75  f =       1788.7  |proj g|=       0.49068
At iterate    76  f =       1788.7  |proj g|=       0.42876
At iterate    77  f =       1788.7  |proj g|=       0.46333
At iterate    78  f =       1788.7  |proj g|=         1.208
At iterate    79  f =       1788.7  |proj g|=        0.6762
At iterate    80  f =       1788.7  |proj g|=       0.49907
At iterate    81  f =       1788.7  |proj g|=       0.33404
At iterate    82  f =       1788.7  |proj g|=       0.16195
At iterate    83  f =       1788.7  |proj g|=       0.40693
At iterate    84  f =       1788.7  |proj g|=       0.19521
At iterate    85  f =       1788.7  |proj g|=       0.16413
At iterate    86  f =       1788.7  |proj g|=       0.13068
At iterate    87  f =       1788.7  |proj g|=      0.061973
At iterate    88  f =       1788.7  |proj g|=        0.1542
At iterate    89  f =       1788.7  |proj g|=       0.18834
At iterate    90  f =       1788.7  |proj g|=       0.11761
At iterate    91  f =       1788.7  |proj g|=       0.11372
At iterate    92  f =       1788.7  |proj g|=       0.13048
At iterate    93  f =       1788.7  |proj g|=       0.41079
At iterate    94  f =       1788.7  |proj g|=       0.13047
At iterate    95  f =       1788.7  |proj g|=      0.060687
At iterate    96  f =       1788.7  |proj g|=      0.061571
At iterate    97  f =       1788.7  |proj g|=       0.13531
At iterate    98  f =       1788.7  |proj g|=       0.20686
At iterate    99  f =       1788.7  |proj g|=       0.13803
At iterate   100  f =       1788.7  |proj g|=       0.44702
At iterate   101  f =       1788.7  |proj g|=       0.17965
final  value 1788.680770 
stopped after 101 iterations
N = 32, M = 5 machine precision = 2.22045e-16
At X0, 0 variables are exactly at the bounds
At iterate     0  f=       1844.5  |proj g|=       1.9627
At iterate     1  f =       1841.8  |proj g|=        1.5053
At iterate     2  f =       1835.2  |proj g|=        1.5189
At iterate     3  f =       1832.8  |proj g|=        1.9281
At iterate     4  f =         1828  |proj g|=        1.2229
At iterate     5  f =       1823.6  |proj g|=        1.0775
At iterate     6  f =         1822  |proj g|=        1.9408
At iterate     7  f =       1809.7  |proj g|=        1.8918
At iterate     8  f =         1803  |proj g|=         1.845
At iterate     9  f =       1802.6  |proj g|=        1.7398
At iterate    10  f =       1801.4  |proj g|=        1.2403
At iterate    11  f =       1799.9  |proj g|=        1.8317
At iterate    12  f =         1799  |proj g|=        1.8231
At iterate    13  f =       1797.6  |proj g|=       0.99073
At iterate    14  f =       1795.2  |proj g|=        1.0283
At iterate    15  f =       1793.4  |proj g|=        1.8782
At iterate    16  f =       1792.8  |proj g|=        1.7883
At iterate    17  f =       1792.7  |proj g|=         1.544
At iterate    18  f =       1792.6  |proj g|=        1.8611
At iterate    19  f =       1792.5  |proj g|=        1.8626
At iterate    20  f =       1791.9  |proj g|=         1.867
At iterate    21  f =       1791.7  |proj g|=        1.4722
At iterate    22  f =       1791.6  |proj g|=         1.456
At iterate    23  f =       1791.3  |proj g|=        1.7959
At iterate    24  f =         1791  |proj g|=        1.7963
At iterate    25  f =       1790.9  |proj g|=        1.8665
At iterate    26  f =       1790.7  |proj g|=        1.8672
At iterate    27  f =       1790.7  |proj g|=       0.78433
At iterate    28  f =       1790.6  |proj g|=       0.78289
At iterate    29  f =       1790.6  |proj g|=        0.7744
At iterate    30  f =       1790.4  |proj g|=        1.8684
At iterate    31  f =       1790.4  |proj g|=        1.7928
At iterate    32  f =       1790.3  |proj g|=       0.80236
At iterate    33  f =       1790.3  |proj g|=       0.82648
At iterate    34  f =       1790.1  |proj g|=       0.87867
At iterate    35  f =         1790  |proj g|=        0.8733
At iterate    36  f =       1789.8  |proj g|=        1.7905
At iterate    37  f =       1789.7  |proj g|=        1.8743
At iterate    38  f =       1789.7  |proj g|=        1.8715
At iterate    39  f =       1789.6  |proj g|=       0.80037
At iterate    40  f =       1789.6  |proj g|=       0.80415
At iterate    41  f =       1789.5  |proj g|=       0.80189
At iterate    42  f =       1789.5  |proj g|=       0.78967
At iterate    43  f =       1789.4  |proj g|=       0.75391
At iterate    44  f =       1789.3  |proj g|=         1.872
At iterate    45  f =       1789.3  |proj g|=       0.68717
At iterate    46  f =       1789.1  |proj g|=        1.4814
At iterate    47  f =       1789.1  |proj g|=         1.487
At iterate    48  f =         1789  |proj g|=        1.8742
At iterate    49  f =         1789  |proj g|=        1.4876
At iterate    50  f =       1788.9  |proj g|=        1.7243
At iterate    51  f =       1788.9  |proj g|=       0.49094
At iterate    52  f =       1788.9  |proj g|=        0.5966
At iterate    53  f =       1788.9  |proj g|=       0.59535
At iterate    54  f =       1788.9  |proj g|=        1.8733
At iterate    55  f =       1788.8  |proj g|=       0.93604
At iterate    56  f =       1788.8  |proj g|=       0.85211
At iterate    57  f =       1788.8  |proj g|=        1.4377
At iterate    58  f =       1788.8  |proj g|=        1.4772
At iterate    59  f =       1788.8  |proj g|=       0.78361
At iterate    60  f =       1788.8  |proj g|=        1.8383
At iterate    61  f =       1788.8  |proj g|=        0.3324
At iterate    62  f =       1788.8  |proj g|=       0.29873
At iterate    63  f =       1788.8  |proj g|=       0.94247
At iterate    64  f =       1788.8  |proj g|=       0.30321
At iterate    65  f =       1788.8  |proj g|=       0.32765
At iterate    66  f =       1788.7  |proj g|=       0.48866
At iterate    67  f =       1788.7  |proj g|=        1.1055
At iterate    68  f =       1788.7  |proj g|=       0.71111
At iterate    69  f =       1788.7  |proj g|=       0.50294
At iterate    70  f =       1788.7  |proj g|=       0.95867
At iterate    71  f =       1788.7  |proj g|=       0.49225
At iterate    72  f =       1788.7  |proj g|=       0.33465
At iterate    73  f =       1788.7  |proj g|=        0.3246
At iterate    74  f =       1788.7  |proj g|=       0.27462
At iterate    75  f =       1788.7  |proj g|=       0.22952
At iterate    76  f =       1788.7  |proj g|=       0.47635
At iterate    77  f =       1788.7  |proj g|=       0.36506
At iterate    78  f =       1788.7  |proj g|=        0.2705
At iterate    79  f =       1788.7  |proj g|=       0.35958
At iterate    80  f =       1788.7  |proj g|=       0.21413
At iterate    81  f =       1788.7  |proj g|=      0.083278
At iterate    82  f =       1788.7  |proj g|=      0.069125
At iterate    83  f =       1788.7  |proj g|=      0.044831
At iterate    84  f =       1788.7  |proj g|=       0.13009
At iterate    85  f =       1788.7  |proj g|=      0.083972
At iterate    86  f =       1788.7  |proj g|=      0.038698
At iterate    87  f =       1788.7  |proj g|=      0.055152
At iterate    88  f =       1788.7  |proj g|=       0.02741
At iterate    89  f =       1788.7  |proj g|=      0.026779
At iterate    90  f =       1788.7  |proj g|=        0.0423
At iterate    91  f =       1788.7  |proj g|=      0.065137
At iterate    92  f =       1788.7  |proj g|=      0.046154
At iterate    93  f =       1788.7  |proj g|=      0.041203
At iterate    94  f =       1788.7  |proj g|=      0.058948
At iterate    95  f =       1788.7  |proj g|=      0.015991
At iterate    96  f =       1788.7  |proj g|=      0.021177

iterations 96
function evaluations 123
segments explored during Cauchy searches 101
BFGS updates skipped 0
active bounds at final generalized Cauchy point 23
norm of the final projected gradient 0.0211773
final function value 1788.68

F = 1788.68
final  value 1788.679245 
converged

* The 4 best values (multistart) obtained are:
 1788.683 1788.682 1788.681 1788.679 
* The model corresponding to the best one (1788.679) is stored. 

optimisation start
------------------
* estimation method   : MLE 
* optimisation method : BFGS 
* analytical gradient : used
* trend model : ~alpha_io + a_wl_io + bio_hum_cn + b_wl_io + dcatch_dlai_io + 
    dqcrit_io + dz0v_dh_io + f0_io + fd_io + g_area_io + g_root_io + 
    g_wood_io + gs_nvg_io + hw_sw_io + kaps_roth + knl_io + lai_max_io + 
    lai_min_io + lma_io + n_inorg_turnover + nmass_io + nr_io + 
    retran_l_io + retran_r_io + r_grow_io + rootd_ft_io + sigl_io + 
    sorp + tleaf_of_io + tlow_io + tupp_io + l_vg_soil
* covariance model : 
  - type :  matern5_2 
  - nugget : NO
  - parameters lower bounds :  1e-10 1e-10 1e-10 1e-10 1e-10 1e-10 1e-10 1e-10 1e-10 1e-10 1e-10 1e-10 1e-10 1e-10 1e-10 1e-10 1e-10 1e-10 1e-10 1e-10 1e-10 1e-10 1e-10 1e-10 1e-10 1e-10 1e-10 1e-10 1e-10 1e-10 1e-10 1e-10 
  - parameters upper bounds :  2 2 1.999244 2 1.995574 2 1.998154 1.790352 2 2 2 1.998084 2 2 2 2 2 1.999201 2 1.996693 1.998361 2 2 1.995738 2 1.993455 1.995643 1.998832 2 2 2 2 
  - best initial criterion value(s) :  -6193.86 -6193.966 -6195.06 -6196.14 

N = 32, M = 5 machine precision = 2.22045e-16
At X0, 0 variables are exactly at the bounds
At iterate     0  f=       6193.9  |proj g|=       1.9414
At iterate     1  f =       6099.8  |proj g|=        1.5695
At iterate     2  f =       6091.5  |proj g|=         1.903
At iterate     3  f =       6089.3  |proj g|=        1.8889
At iterate     4  f =       6083.7  |proj g|=        1.8194
At iterate     5  f =       6082.8  |proj g|=        1.8071
At iterate     6  f =       6079.7  |proj g|=        1.9016
At iterate     7  f =       6077.9  |proj g|=        1.8974
At iterate     8  f =       6068.1  |proj g|=        1.4921
At iterate     9  f =       6066.4  |proj g|=        1.4399
At iterate    10  f =       6064.5  |proj g|=        1.9119
At iterate    11  f =       6063.5  |proj g|=        1.5745
At iterate    12  f =       6060.4  |proj g|=        1.5219
At iterate    13  f =         6060  |proj g|=        1.5145
At iterate    14  f =         6059  |proj g|=        1.9074
At iterate    15  f =       6057.9  |proj g|=        1.8963
At iterate    16  f =       6056.2  |proj g|=        1.2182
At iterate    17  f =       6054.7  |proj g|=        1.8811
At iterate    18  f =       6053.9  |proj g|=        1.1028
At iterate    19  f =       6053.2  |proj g|=        1.0823
At iterate    20  f =       6053.1  |proj g|=         1.888
At iterate    21  f =       6052.9  |proj g|=        1.0711
At iterate    22  f =       6052.7  |proj g|=        1.4231
At iterate    23  f =       6052.5  |proj g|=        1.8888
At iterate    24  f =       6052.4  |proj g|=        1.3347
At iterate    25  f =       6052.4  |proj g|=        1.0392
At iterate    26  f =       6052.4  |proj g|=        1.8869
At iterate    27  f =       6052.3  |proj g|=        1.0399
At iterate    28  f =       6052.3  |proj g|=        1.0381
At iterate    29  f =       6052.3  |proj g|=         1.023
At iterate    30  f =       6052.1  |proj g|=       0.80119
At iterate    31  f =       6051.9  |proj g|=       0.74419
At iterate    32  f =       6051.9  |proj g|=       0.69194
At iterate    33  f =       6051.8  |proj g|=        1.7041
At iterate    34  f =       6051.8  |proj g|=       0.83632
At iterate    35  f =       6051.8  |proj g|=       0.83293
At iterate    36  f =       6051.7  |proj g|=       0.64953
At iterate    37  f =       6051.7  |proj g|=       0.48825
At iterate    38  f =       6051.7  |proj g|=       0.28695
At iterate    39  f =       6051.7  |proj g|=        1.6661
At iterate    40  f =       6051.7  |proj g|=       0.46224
At iterate    41  f =       6051.7  |proj g|=       0.15696
At iterate    42  f =       6051.7  |proj g|=       0.14672
At iterate    43  f =       6051.7  |proj g|=       0.11677
At iterate    44  f =       6051.7  |proj g|=      0.048306
At iterate    45  f =       6051.7  |proj g|=      0.048253
At iterate    46  f =       6051.7  |proj g|=       0.09721
At iterate    47  f =       6051.7  |proj g|=       0.11672
At iterate    48  f =       6051.7  |proj g|=         0.103
At iterate    49  f =       6051.7  |proj g|=       0.10676
At iterate    50  f =       6051.7  |proj g|=      0.012401

iterations 50
function evaluations 56
segments explored during Cauchy searches 62
BFGS updates skipped 0
active bounds at final generalized Cauchy point 25
norm of the final projected gradient 0.0124006
final function value 6051.72

F = 6051.72
final  value 6051.720344 
converged
N = 32, M = 5 machine precision = 2.22045e-16
At X0, 0 variables are exactly at the bounds
At iterate     0  f=         6194  |proj g|=        1.896
At iterate     1  f =       6096.2  |proj g|=        1.9139
At iterate     2  f =       6095.7  |proj g|=        1.9117
At iterate     3  f =       6092.7  |proj g|=        1.9101
At iterate     4  f =       6092.3  |proj g|=        1.9112
At iterate     5  f =       6091.6  |proj g|=        1.9106
ys=-1.660e-03  -gs= 7.046e-01, BFGS update SKIPPED
At iterate     6  f =       6088.6  |proj g|=        1.9268
At iterate     7  f =         6080  |proj g|=        1.9345
ys=-1.615e-02  -gs= 8.492e+00, BFGS update SKIPPED
At iterate     8  f =         6077  |proj g|=        1.9229
At iterate     9  f =       6069.1  |proj g|=        1.8154
At iterate    10  f =       6068.5  |proj g|=        1.6384
At iterate    11  f =         6068  |proj g|=        1.9184
At iterate    12  f =       6067.9  |proj g|=        1.9211
At iterate    13  f =         6067  |proj g|=        1.9248
At iterate    14  f =       6063.9  |proj g|=        1.9201
At iterate    15  f =       6062.4  |proj g|=        1.9124
At iterate    16  f =       6061.1  |proj g|=        1.7501
At iterate    17  f =       6059.5  |proj g|=        1.9052
At iterate    18  f =       6059.1  |proj g|=        1.7219
At iterate    19  f =       6057.7  |proj g|=        1.7267
At iterate    20  f =       6056.9  |proj g|=        1.7136
At iterate    21  f =       6056.1  |proj g|=        1.6472
At iterate    22  f =       6055.3  |proj g|=        1.8976
At iterate    23  f =       6055.2  |proj g|=        1.6393
At iterate    24  f =         6055  |proj g|=         1.629
At iterate    25  f =       6054.6  |proj g|=        1.8972
At iterate    26  f =       6054.6  |proj g|=        1.5981
At iterate    27  f =       6054.5  |proj g|=        1.5928
At iterate    28  f =       6054.4  |proj g|=        1.5774
At iterate    29  f =       6054.2  |proj g|=        1.8957
At iterate    30  f =       6054.1  |proj g|=        1.8949
At iterate    31  f =       6052.6  |proj g|=        1.2987
At iterate    32  f =       6052.3  |proj g|=        1.2399
At iterate    33  f =       6051.9  |proj g|=       0.96675
At iterate    34  f =       6051.8  |proj g|=       0.96791
At iterate    35  f =       6051.8  |proj g|=       0.94212
At iterate    36  f =       6051.8  |proj g|=        1.8852
At iterate    37  f =       6051.8  |proj g|=       0.71337
At iterate    38  f =       6051.8  |proj g|=       0.71134
At iterate    39  f =       6051.7  |proj g|=        0.3276
At iterate    40  f =       6051.7  |proj g|=       0.19604
At iterate    41  f =       6051.7  |proj g|=       0.14445
At iterate    42  f =       6051.7  |proj g|=       0.13129
At iterate    43  f =       6051.7  |proj g|=       0.11073
At iterate    44  f =       6051.7  |proj g|=       0.65001
At iterate    45  f =       6051.7  |proj g|=       0.50626
At iterate    46  f =       6051.7  |proj g|=       0.21399
At iterate    47  f =       6051.7  |proj g|=        0.1184
At iterate    48  f =       6051.7  |proj g|=       0.11665
At iterate    49  f =       6051.7  |proj g|=      0.076832
At iterate    50  f =       6051.7  |proj g|=       0.11684
At iterate    51  f =       6051.7  |proj g|=        0.1167
At iterate    52  f =       6051.7  |proj g|=       0.09314
At iterate    53  f =       6051.7  |proj g|=       0.10182
At iterate    54  f =       6051.7  |proj g|=      0.050777
At iterate    55  f =       6051.7  |proj g|=      0.025595
At iterate    56  f =       6051.7  |proj g|=       0.11416

iterations 56
function evaluations 73
segments explored during Cauchy searches 68
BFGS updates skipped 2
active bounds at final generalized Cauchy point 25
norm of the final projected gradient 0.114159
final function value 6051.72

F = 6051.72
final  value 6051.720361 
converged
N = 32, M = 5 machine precision = 2.22045e-16
At X0, 0 variables are exactly at the bounds
At iterate     0  f=       6195.1  |proj g|=       1.8444
At iterate     1  f =       6190.4  |proj g|=         1.567
At iterate     2  f =       6180.2  |proj g|=        1.8736
At iterate     3  f =       6172.8  |proj g|=        1.8258
ys=-8.212e-01  -gs= 6.952e+00, BFGS update SKIPPED
At iterate     4  f =       6153.1  |proj g|=        1.7389
ys=-2.505e+00  -gs= 1.744e+01, BFGS update SKIPPED
At iterate     5  f =       6141.1  |proj g|=         1.694
At iterate     6  f =       6130.4  |proj g|=        1.9376
At iterate     7  f =         6113  |proj g|=        1.8015
At iterate     8  f =       6107.7  |proj g|=        1.8026
At iterate     9  f =       6085.2  |proj g|=        1.6781
At iterate    10  f =         6084  |proj g|=        1.8835
At iterate    11  f =       6082.6  |proj g|=        1.8806
At iterate    12  f =       6072.2  |proj g|=        1.8738
At iterate    13  f =       6070.1  |proj g|=        1.4886
At iterate    14  f =       6065.8  |proj g|=         1.381
At iterate    15  f =       6064.4  |proj g|=        1.3835
At iterate    16  f =         6064  |proj g|=        1.8899
At iterate    17  f =       6062.2  |proj g|=        1.8814
At iterate    18  f =       6061.5  |proj g|=         1.421
At iterate    19  f =       6059.1  |proj g|=        1.4174
At iterate    20  f =       6058.3  |proj g|=        1.4164
At iterate    21  f =       6056.7  |proj g|=        1.4007
At iterate    22  f =       6055.7  |proj g|=         1.901
At iterate    23  f =       6055.3  |proj g|=        1.4749
At iterate    24  f =       6054.9  |proj g|=        1.4674
At iterate    25  f =       6054.7  |proj g|=        1.8948
At iterate    26  f =       6054.5  |proj g|=        1.8955
At iterate    27  f =       6054.4  |proj g|=        1.8936
At iterate    28  f =       6053.8  |proj g|=        1.1737
At iterate    29  f =       6053.3  |proj g|=        1.8945
At iterate    30  f =       6053.2  |proj g|=        1.8917
At iterate    31  f =       6053.1  |proj g|=         1.353
At iterate    32  f =       6052.9  |proj g|=        1.4434
At iterate    33  f =       6052.8  |proj g|=        1.8925
At iterate    34  f =       6052.7  |proj g|=         1.441
At iterate    35  f =       6052.4  |proj g|=        1.4288
At iterate    36  f =       6052.3  |proj g|=        1.0089
At iterate    37  f =       6052.2  |proj g|=        1.8889
At iterate    38  f =       6052.1  |proj g|=        1.8888
At iterate    39  f =       6052.1  |proj g|=        1.6079
At iterate    40  f =         6052  |proj g|=        1.2944
At iterate    41  f =         6052  |proj g|=        1.1205
At iterate    42  f =         6052  |proj g|=        1.8863
At iterate    43  f =         6052  |proj g|=         1.429
At iterate    44  f =       6051.9  |proj g|=       0.92281
At iterate    45  f =       6051.9  |proj g|=        1.3317
At iterate    46  f =       6051.9  |proj g|=        1.3044
At iterate    47  f =       6051.9  |proj g|=       0.78826
At iterate    48  f =       6051.9  |proj g|=       0.80595
At iterate    49  f =       6051.9  |proj g|=       0.91726
At iterate    50  f =       6051.8  |proj g|=        1.8835
At iterate    51  f =       6051.7  |proj g|=        1.8839
At iterate    52  f =       6051.7  |proj g|=       0.62815
At iterate    53  f =       6051.7  |proj g|=       0.59062
At iterate    54  f =       6051.7  |proj g|=       0.09207
At iterate    55  f =       6051.7  |proj g|=      0.069011
At iterate    56  f =       6051.7  |proj g|=      0.016776
At iterate    57  f =       6051.7  |proj g|=      0.007937

iterations 57
function evaluations 64
segments explored during Cauchy searches 65
BFGS updates skipped 2
active bounds at final generalized Cauchy point 25
norm of the final projected gradient 0.00793695
final function value 6051.72

F = 6051.72
final  value 6051.720335 
converged
N = 32, M = 5 machine precision = 2.22045e-16
At X0, 0 variables are exactly at the bounds
At iterate     0  f=       6196.1  |proj g|=       1.9441
At iterate     1  f =       6158.6  |proj g|=        1.8479
At iterate     2  f =       6131.1  |proj g|=        1.8288
ys=-4.125e+00  -gs= 2.537e+01, BFGS update SKIPPED
At iterate     3  f =       6093.3  |proj g|=        1.7964
At iterate     4  f =       6091.6  |proj g|=        1.8966
At iterate     5  f =       6089.7  |proj g|=        1.7487
At iterate     6  f =       6078.4  |proj g|=        1.7556
At iterate     7  f =       6069.5  |proj g|=        1.7184
At iterate     8  f =       6066.2  |proj g|=        1.6136
At iterate     9  f =       6065.3  |proj g|=        1.9357
At iterate    10  f =       6063.3  |proj g|=        1.9207
At iterate    11  f =       6061.3  |proj g|=         1.909
At iterate    12  f =       6059.9  |proj g|=        1.8995
At iterate    13  f =       6057.7  |proj g|=        1.7114
At iterate    14  f =       6057.6  |proj g|=        1.7106
At iterate    15  f =       6057.1  |proj g|=        1.9015
At iterate    16  f =       6056.4  |proj g|=        1.9085
At iterate    17  f =         6056  |proj g|=        1.8998
At iterate    18  f =       6055.9  |proj g|=        1.6836
At iterate    19  f =       6055.7  |proj g|=        1.6795
At iterate    20  f =       6055.6  |proj g|=        1.8978
At iterate    21  f =       6055.5  |proj g|=        1.8959
At iterate    22  f =       6055.3  |proj g|=        1.6477
At iterate    23  f =         6055  |proj g|=        1.6138
At iterate    24  f =       6054.5  |proj g|=        1.5619
At iterate    25  f =       6054.1  |proj g|=        1.8977
At iterate    26  f =         6054  |proj g|=        1.8975
At iterate    27  f =       6053.4  |proj g|=        1.4395
At iterate    28  f =         6053  |proj g|=         1.889
At iterate    29  f =       6052.3  |proj g|=        1.8807
At iterate    30  f =         6052  |proj g|=       0.72993
At iterate    31  f =       6051.9  |proj g|=       0.84726
At iterate    32  f =       6051.8  |proj g|=        1.8843
At iterate    33  f =       6051.8  |proj g|=       0.47819
At iterate    34  f =       6051.8  |proj g|=        1.8846
At iterate    35  f =       6051.7  |proj g|=       0.70317
At iterate    36  f =       6051.7  |proj g|=       0.58719
At iterate    37  f =       6051.7  |proj g|=       0.53426
At iterate    38  f =       6051.7  |proj g|=       0.28181
At iterate    39  f =       6051.7  |proj g|=       0.27471
At iterate    40  f =       6051.7  |proj g|=       0.71023
At iterate    41  f =       6051.7  |proj g|=        0.7442
At iterate    42  f =       6051.7  |proj g|=       0.17579
At iterate    43  f =       6051.7  |proj g|=       0.12481
At iterate    44  f =       6051.7  |proj g|=       0.11666
At iterate    45  f =       6051.7  |proj g|=       0.80637
At iterate    46  f =       6051.7  |proj g|=      0.047588
At iterate    47  f =       6051.7  |proj g|=      0.041069
At iterate    48  f =       6051.7  |proj g|=        0.1168
At iterate    49  f =       6051.7  |proj g|=       0.11675
At iterate    50  f =       6051.7  |proj g|=      0.043049
At iterate    51  f =       6051.7  |proj g|=      0.042103
At iterate    52  f =       6051.7  |proj g|=      0.065384
At iterate    53  f =       6051.7  |proj g|=       0.11522
At iterate    54  f =       6051.7  |proj g|=      0.044015

iterations 54
function evaluations 68
segments explored during Cauchy searches 64
BFGS updates skipped 1
active bounds at final generalized Cauchy point 25
norm of the final projected gradient 0.0440146
final function value 6051.72

F = 6051.72
final  value 6051.720388 
converged

* The 4 best values (multistart) obtained are:
 6051.72 6051.72 6051.72 6051.72 
* The model corresponding to the best one (6051.72) is stored. 
[1] 10.81038
[1] 369550.6
[1] 8.353776
[1] 5.220835

1.15 Constrain first and then do sensitivity analysis?

The problem with doing constraint first is that you end up with a non-hypercube shaped input space (corners have been knocked off by constraint), which is not ideal. We might therefore want different sensitivity measures for pre- and post-constrained ensemble.

[1] 8.353776
[1] 8.353615
[1] 5.220835
[1] 5.220903

1.16 Initial sensitivity Matrix

It looks as though bwl_io is very influential across a number of variables, even though it didn’t appear that interesting in the parginal plots. Why is that?

1.17 Re-examine bwl_io

A closer look at bwl_io now that the impact of f0_io has been removed shows a large number of “zero” NPP when bwl_io is at low values, which could well be the source of apparent sensitivity.

Take only higher values of bwl_io for the next round of constraints.

2 Remove ensemble members with low b_wl and see if the sensitivity analyses change and the emulators get better.

# Plot the regular km emulator.


optimisation start
------------------
* estimation method   : MLE 
* optimisation method : BFGS 
* analytical gradient : used
* trend model : ~alpha_io + a_wl_io + bio_hum_cn + b_wl_io + dcatch_dlai_io + 
    dqcrit_io + dz0v_dh_io + f0_io + fd_io + g_area_io + g_root_io + 
    g_wood_io + gs_nvg_io + hw_sw_io + kaps_roth + knl_io + lai_max_io + 
    lai_min_io + lma_io + n_inorg_turnover + nmass_io + nr_io + 
    retran_l_io + retran_r_io + r_grow_io + rootd_ft_io + sigl_io + 
    sorp + tleaf_of_io + tlow_io + tupp_io + l_vg_soil
* covariance model : 
  - type :  matern5_2 
  - nugget : NO
  - parameters lower bounds :  1e-10 1e-10 1e-10 1e-10 1e-10 1e-10 1e-10 1e-10 1e-10 1e-10 1e-10 1e-10 1e-10 1e-10 1e-10 1e-10 1e-10 1e-10 1e-10 1e-10 1e-10 1e-10 1e-10 1e-10 1e-10 1e-10 1e-10 1e-10 1e-10 1e-10 1e-10 1e-10 
  - parameters upper bounds :  2 2 1.999244 1.698141 1.994798 1.990622 1.998154 1.778477 2 2 2 1.998084 2 2 2 1.99598 2 1.989889 1.997502 1.989483 1.98997 1.987916 1.983347 1.988424 2 1.990947 1.995643 1.994232 1.992247 2 2 2 
  - best initial criterion value(s) :  -5137.861 

N = 32, M = 5 machine precision = 2.22045e-16
At X0, 0 variables are exactly at the bounds
At iterate     0  f=       5137.9  |proj g|=       1.8356
At iterate     1  f =       5135.4  |proj g|=        1.7202
At iterate     2  f =       5131.9  |proj g|=           1.6
At iterate     3  f =       5131.2  |proj g|=        1.6826
At iterate     4  f =       5122.2  |proj g|=        1.6838
At iterate     5  f =       5119.7  |proj g|=        1.6697
At iterate     6  f =       5110.5  |proj g|=        1.6667
At iterate     7  f =       5105.6  |proj g|=        1.3939
At iterate     8  f =       5098.3  |proj g|=        1.4145
At iterate     9  f =       5093.3  |proj g|=         1.592
At iterate    10  f =       5091.8  |proj g|=        1.5626
At iterate    11  f =       5089.7  |proj g|=        1.4986
At iterate    12  f =       5088.5  |proj g|=        1.3214
At iterate    13  f =       5085.1  |proj g|=         1.501
At iterate    14  f =       5083.9  |proj g|=        1.4621
At iterate    15  f =       5082.1  |proj g|=        1.4517
At iterate    16  f =       5081.1  |proj g|=         1.494
At iterate    17  f =       5080.6  |proj g|=       0.95799
At iterate    18  f =       5080.4  |proj g|=        1.3623
At iterate    19  f =         5080  |proj g|=       0.56793
At iterate    20  f =       5079.9  |proj g|=        1.4786
At iterate    21  f =       5079.8  |proj g|=       0.46896
At iterate    22  f =       5079.8  |proj g|=       0.28689
At iterate    23  f =       5079.8  |proj g|=       0.57427
At iterate    24  f =       5079.7  |proj g|=       0.57268
At iterate    25  f =       5079.7  |proj g|=       0.36422
At iterate    26  f =       5079.7  |proj g|=       0.16654
At iterate    27  f =       5079.7  |proj g|=       0.22658
At iterate    28  f =       5079.7  |proj g|=       0.27311
At iterate    29  f =       5079.7  |proj g|=       0.21159
At iterate    30  f =       5079.7  |proj g|=       0.52762
At iterate    31  f =       5079.7  |proj g|=        0.2638
At iterate    32  f =       5079.7  |proj g|=       0.15332
At iterate    33  f =       5079.7  |proj g|=       0.16807
At iterate    34  f =       5079.7  |proj g|=        0.2156
At iterate    35  f =       5079.7  |proj g|=      0.093168
At iterate    36  f =       5079.7  |proj g|=      0.069853
At iterate    37  f =       5079.7  |proj g|=       0.11439
At iterate    38  f =       5079.7  |proj g|=       0.18854
At iterate    39  f =       5079.7  |proj g|=       0.14403
At iterate    40  f =       5079.6  |proj g|=      0.075684
At iterate    41  f =       5079.6  |proj g|=      0.045529
At iterate    42  f =       5079.6  |proj g|=      0.029163
At iterate    43  f =       5079.6  |proj g|=      0.028335
At iterate    44  f =       5079.6  |proj g|=      0.081292
At iterate    45  f =       5079.6  |proj g|=       0.03851
At iterate    46  f =       5079.6  |proj g|=      0.011842
At iterate    47  f =       5079.6  |proj g|=      0.010565

iterations 47
function evaluations 54
segments explored during Cauchy searches 60
BFGS updates skipped 0
active bounds at final generalized Cauchy point 20
norm of the final projected gradient 0.0105653
final function value 5079.65

F = 5079.65
final  value 5079.648744 
converged

2.1 With b_wl truncated, we can clearly see the sensitivities change.

2.2 Plot both sensitivity matrices on top of one another.

It looks as though both the absolute value and the change over time are controlled by the same parameters.

2.3 How good are the emulators for each output?

The emulators appear to be at least capturing the broad response for all of the output variables.

First, plot the straight kriging emulators

3 km emulators for change in variables over time

[1] 5.433077
[1] 5.142409
[1] 5.2209
[1] 4.193005
[1] 4.219396
[1] 4.531841
[1] 5.629425
[1] 8.565018
[1] 5.224583
[1] 9.223968
[1] 7.089
[1] 7.78196
[1] 6.900971
[1] 6.929568

Next, plot the twostep glmnet/km emulators

3.1 TwoStep emulator performance for modern values

4 Compare Leave-one-out statistics for the two types of emulator

We use the leave-one-out Mean Absolute Error, expressed as a percentage of the range of the output across the ensemble. We find that the twostep emulatorisn’t significantly more accurate, and is indeed less accurate for tree fraction.

[1] 5.410355
[1] 4.733929
[1] 5.215455
[1] 4.173501
[1] 4.03861
[1] 4.597044
[1] 5.501413
[1] 8.563912
[1] 5.213222
[1] 11.36184
[1] 7.260354
[1] 7.707121
[1] 6.725096
[1] 6.865819

5 History matching and generation of new ensemble members

To use History Matching, we need to specify targets for various model outputs. We treat these targets as “observations” with an uncertainty where a model run marked as “implausible” (beyond 3sd) matches the hard boundaries previously identified by A. Wiltshire as being desirable.

Choose the centre of the (implied) uniform distribution. cs_gb.target = (3000 - 750) / 2 = 1125 cv.target = (800 - 300) / 2 = 250 npp_n_gb.target = (80 - 35) / 2 = 22.5

nbp.target = 0 (gpp.target = 75) (runoff.target = 1)

(to do: visualise implausibility of design and loo emulated values of design as histogram)

5.1 visualise the constraints

5.2 Timeseries that match the constraints.

Plot the original ensemble, plus the stuff that matches the constraints. Include anomalies.

We find that adding a constraint to level 2 constrains the behaviour of the soil carbon pool, but not the vegetation carbon pool. Probably not a surprise, given the Soil Carbon pool (and changes) are much larger than the vegetation carbon pool.

5.3 Total land carbon change

We plot the JULES total land carbon change from 1850, together with “observations” from the Global Carbon Budget (Friedligstein et al, 2020). The “observations are the cumulative sum of the ‘land sink’ column on the”historical observations tab of the data from the paper. It states “The land sink is the average of several dynamic global vegetation models that reproduce the observed mean total land sink of the 1990s.”

5.3.1 Land carbon Sink?

I think to make a fair comparison, we might need to take the diff of the anomaly (or just the timeseries), as the above represents the total change since 1850, and I think all the “land sink” stuff looks at the year-to-year changes.

5.3.2 Identify parts of parameter space where the land carbon sink is at its maximum

What do these parts of parameter space tell us about what we need to do to have the model reproduce reality?

5.3.3 what parts of parameter space are the closest?


optimisation start
------------------
* estimation method   : MLE 
* optimisation method : BFGS 
* analytical gradient : used
* trend model : ~alpha_io + a_wl_io + bio_hum_cn + b_wl_io + dcatch_dlai_io + 
    dqcrit_io + dz0v_dh_io + f0_io + fd_io + g_area_io + g_root_io + 
    g_wood_io + gs_nvg_io + hw_sw_io + kaps_roth + knl_io + lai_max_io + 
    lai_min_io + lma_io + n_inorg_turnover + nmass_io + nr_io + 
    retran_l_io + retran_r_io + r_grow_io + rootd_ft_io + sigl_io + 
    sorp + tleaf_of_io + tlow_io + tupp_io + l_vg_soil
* covariance model : 
  - type :  matern5_2 
  - nugget : NO
  - parameters lower bounds :  1e-10 1e-10 1e-10 1e-10 1e-10 1e-10 1e-10 1e-10 1e-10 1e-10 1e-10 1e-10 1e-10 1e-10 1e-10 1e-10 1e-10 1e-10 1e-10 1e-10 1e-10 1e-10 1e-10 1e-10 1e-10 1e-10 1e-10 1e-10 1e-10 1e-10 1e-10 1e-10 
  - parameters upper bounds :  2 2 1.999244 1.698141 1.994798 1.990622 1.998154 1.778477 2 2 2 1.998084 2 2 2 1.99598 2 1.989889 1.997502 1.989483 1.98997 1.987916 1.983347 1.988424 2 1.990947 1.995643 1.994232 1.992247 2 2 2 
  - best initial criterion value(s) :  -106.4158 

N = 32, M = 5 machine precision = 2.22045e-16
At X0, 0 variables are exactly at the bounds
At iterate     0  f=       106.42  |proj g|=       1.8453
At iterate     1  f =       103.09  |proj g|=         1.819
At iterate     2  f =       97.125  |proj g|=        1.6466
At iterate     3  f =       95.132  |proj g|=        1.6743
At iterate     4  f =       91.572  |proj g|=        1.6622
At iterate     5  f =       89.835  |proj g|=        1.6389
At iterate     6  f =       88.807  |proj g|=        1.5108
At iterate     7  f =       87.513  |proj g|=        1.7187
At iterate     8  f =       86.326  |proj g|=         1.638
At iterate     9  f =       85.522  |proj g|=        1.5586
At iterate    10  f =        85.21  |proj g|=         1.342
At iterate    11  f =        84.63  |proj g|=        1.2524
At iterate    12  f =       84.111  |proj g|=        1.2971
At iterate    13  f =        83.72  |proj g|=        1.1355
At iterate    14  f =        83.52  |proj g|=        1.0089
At iterate    15  f =       82.998  |proj g|=       0.69506
At iterate    16  f =       82.939  |proj g|=        1.7322
At iterate    17  f =       82.779  |proj g|=        1.7049
At iterate    18  f =       82.708  |proj g|=       0.80111
At iterate    19  f =       82.614  |proj g|=       0.71523
At iterate    20  f =       82.575  |proj g|=       0.65009
At iterate    21  f =       82.517  |proj g|=       0.61643
At iterate    22  f =       82.482  |proj g|=       0.53998
At iterate    23  f =        82.35  |proj g|=        1.4933
At iterate    24  f =        82.31  |proj g|=        1.4399
At iterate    25  f =       82.247  |proj g|=       0.83833
At iterate    26  f =       82.179  |proj g|=        0.6743
At iterate    27  f =       82.125  |proj g|=       0.61099
At iterate    28  f =       82.077  |proj g|=       0.69756
At iterate    29  f =       82.068  |proj g|=       0.50643
At iterate    30  f =       82.045  |proj g|=       0.53157
At iterate    31  f =       81.976  |proj g|=        1.2632
At iterate    32  f =       81.806  |proj g|=        1.4306
At iterate    33  f =       81.751  |proj g|=        1.1701
At iterate    34  f =       81.628  |proj g|=        1.1438
At iterate    35  f =       81.556  |proj g|=        1.6474
At iterate    36  f =       81.483  |proj g|=        1.4191
At iterate    37  f =       81.399  |proj g|=       0.67894
At iterate    38  f =       81.324  |proj g|=       0.33289
At iterate    39  f =       81.314  |proj g|=        1.0959
At iterate    40  f =       81.302  |proj g|=       0.32766
At iterate    41  f =       81.295  |proj g|=        0.3297
At iterate    42  f =       81.277  |proj g|=       0.36728
At iterate    43  f =       81.265  |proj g|=       0.30341
At iterate    44  f =       81.247  |proj g|=       0.69733
At iterate    45  f =       81.216  |proj g|=        1.1062
At iterate    46  f =       81.177  |proj g|=        1.1638
At iterate    47  f =       81.155  |proj g|=       0.71712
At iterate    48  f =       81.109  |proj g|=       0.51864
At iterate    49  f =       81.077  |proj g|=       0.41088
At iterate    50  f =       81.059  |proj g|=       0.39031
At iterate    51  f =       81.055  |proj g|=       0.33235
At iterate    52  f =       81.052  |proj g|=       0.14717
At iterate    53  f =       81.049  |proj g|=        0.1497
At iterate    54  f =       81.043  |proj g|=       0.15788
At iterate    55  f =       81.035  |proj g|=       0.29801
At iterate    56  f =       81.033  |proj g|=       0.57956
At iterate    57  f =       81.022  |proj g|=       0.39169
At iterate    58  f =       81.018  |proj g|=       0.16287
At iterate    59  f =       81.015  |proj g|=       0.16427
At iterate    60  f =       81.003  |proj g|=       0.17202
At iterate    61  f =       80.998  |proj g|=       0.55788
At iterate    62  f =       80.983  |proj g|=        0.3853
At iterate    63  f =       80.978  |proj g|=       0.14235
At iterate    64  f =       80.973  |proj g|=       0.16257
At iterate    65  f =       80.969  |proj g|=       0.55124
At iterate    66  f =       80.966  |proj g|=       0.17098
At iterate    67  f =       80.964  |proj g|=       0.15834
At iterate    68  f =       80.961  |proj g|=       0.19492
At iterate    69  f =        80.96  |proj g|=      0.085999
At iterate    70  f =       80.959  |proj g|=       0.20316
At iterate    71  f =       80.957  |proj g|=       0.22804
At iterate    72  f =       80.956  |proj g|=       0.18647
At iterate    73  f =       80.955  |proj g|=      0.058348
At iterate    74  f =       80.955  |proj g|=      0.054364
At iterate    75  f =       80.953  |proj g|=      0.091177
At iterate    76  f =       80.953  |proj g|=       0.31904
At iterate    77  f =       80.951  |proj g|=       0.21525
At iterate    78  f =       80.947  |proj g|=       0.12164
At iterate    79  f =       80.943  |proj g|=       0.12463
At iterate    80  f =       80.941  |proj g|=       0.18732
At iterate    81  f =       80.939  |proj g|=       0.08267
At iterate    82  f =       80.938  |proj g|=       0.24049
At iterate    83  f =       80.938  |proj g|=       0.17522
At iterate    84  f =       80.937  |proj g|=       0.10918
At iterate    85  f =       80.937  |proj g|=      0.079848
At iterate    86  f =       80.936  |proj g|=      0.045969
At iterate    87  f =       80.936  |proj g|=      0.043919
At iterate    88  f =       80.936  |proj g|=       0.12858
At iterate    89  f =       80.936  |proj g|=       0.04115
At iterate    90  f =       80.936  |proj g|=      0.025463
At iterate    91  f =       80.936  |proj g|=      0.018393
At iterate    92  f =       80.936  |proj g|=      0.020207
At iterate    93  f =       80.935  |proj g|=      0.050297
At iterate    94  f =       80.935  |proj g|=      0.018193
At iterate    95  f =       80.935  |proj g|=      0.015472
At iterate    96  f =       80.935  |proj g|=      0.014675
At iterate    97  f =       80.935  |proj g|=      0.072348
At iterate    98  f =       80.935  |proj g|=       0.02166
At iterate    99  f =       80.935  |proj g|=      0.017904
At iterate   100  f =       80.935  |proj g|=      0.040947
At iterate   101  f =       80.935  |proj g|=      0.024479
final  value 80.934858 
stopped after 101 iterations

5.4 Augment the design.

The function addNroyDesignPoints builds an emulator for each model output in Y. It compares the output of each emulator at a number of candidate desin points, and chooses a space-filling set of them that that are Not Ruled Out Yet (statistically close to the observation at Y_target).

5.5 Write the augmented design

The function write_jules_design here simply takes the points calculated by addNroyDesignPoints and writes them to configuration files.

5.6 Check the design

Check that the augmented design produces what we expect. New ensemble members should be somewhat constrained within the boundaries of the original design, if the comparison to data offers any constraint.


optimisation start
------------------
* estimation method   : MLE 
* optimisation method : BFGS 
* analytical gradient : used
* trend model : ~alpha_io + a_wl_io + bio_hum_cn + b_wl_io + dcatch_dlai_io + 
    dqcrit_io + dz0v_dh_io + f0_io + fd_io + g_area_io + g_root_io + 
    g_wood_io + gs_nvg_io + hw_sw_io + kaps_roth + knl_io + lai_max_io + 
    lai_min_io + lma_io + n_inorg_turnover + nmass_io + nr_io + 
    retran_l_io + retran_r_io + r_grow_io + rootd_ft_io + sigl_io + 
    sorp + tleaf_of_io + tlow_io + tupp_io + l_vg_soil
* covariance model : 
  - type :  matern5_2 
  - nugget : NO
  - parameters lower bounds :  1e-10 1e-10 1e-10 1e-10 1e-10 1e-10 1e-10 1e-10 1e-10 1e-10 1e-10 1e-10 1e-10 1e-10 1e-10 1e-10 1e-10 1e-10 1e-10 1e-10 1e-10 1e-10 1e-10 1e-10 1e-10 1e-10 1e-10 1e-10 1e-10 1e-10 1e-10 1e-10 
  - parameters upper bounds :  2 2 1.999244 1.698141 1.994798 1.990622 1.998154 1.778477 2 2 2 1.998084 2 2 2 1.99598 2 1.989889 1.997502 1.989483 1.98997 1.987916 1.983347 1.988424 2 1.990947 1.995643 1.994232 1.992247 2 2 2 
  - best initial criterion value(s) :  -109.2909 

N = 32, M = 5 machine precision = 2.22045e-16
At X0, 0 variables are exactly at the bounds
At iterate     0  f=       109.29  |proj g|=        1.871
At iterate     1  f =       100.41  |proj g|=        1.3975
At iterate     2  f =       96.533  |proj g|=        1.3088
At iterate     3  f =       95.227  |proj g|=        1.2724
At iterate     4  f =       92.512  |proj g|=        1.5964
At iterate     5  f =       91.143  |proj g|=        1.7368
At iterate     6  f =       89.279  |proj g|=        1.6991
At iterate     7  f =       88.195  |proj g|=        1.7046
At iterate     8  f =       87.014  |proj g|=        1.5114
At iterate     9  f =       85.689  |proj g|=        1.0118
At iterate    10  f =       85.023  |proj g|=        1.7091
At iterate    11  f =       84.569  |proj g|=        1.3563
At iterate    12  f =       84.158  |proj g|=       0.80825
At iterate    13  f =        84.09  |proj g|=        1.6904
At iterate    14  f =       83.823  |proj g|=        1.6909
At iterate    15  f =        83.55  |proj g|=       0.81435
At iterate    16  f =       83.371  |proj g|=       0.96783
At iterate    17  f =       83.094  |proj g|=        1.1149
At iterate    18  f =       82.902  |proj g|=       0.63225
At iterate    19  f =       82.876  |proj g|=        1.6631
At iterate    20  f =       82.821  |proj g|=       0.47627
At iterate    21  f =       82.812  |proj g|=       0.44135
At iterate    22  f =       82.724  |proj g|=       0.87459
At iterate    23  f =       82.656  |proj g|=       0.80084
At iterate    24  f =       82.618  |proj g|=       0.37465
At iterate    25  f =       82.608  |proj g|=       0.27736
At iterate    26  f =       82.599  |proj g|=       0.18904
At iterate    27  f =       82.587  |proj g|=       0.29552
At iterate    28  f =       82.563  |proj g|=       0.53817
At iterate    29  f =       82.536  |proj g|=         0.389
At iterate    30  f =        82.52  |proj g|=       0.27542
At iterate    31  f =       82.509  |proj g|=       0.43571
At iterate    32  f =       82.496  |proj g|=       0.39767
At iterate    33  f =       82.472  |proj g|=       0.67351
At iterate    34  f =       82.447  |proj g|=        1.0541
At iterate    35  f =       82.426  |proj g|=       0.41252
At iterate    36  f =       82.407  |proj g|=       0.36104
At iterate    37  f =        82.39  |proj g|=       0.37105
At iterate    38  f =       82.352  |proj g|=       0.40153
At iterate    39  f =       82.345  |proj g|=       0.48576
At iterate    40  f =       82.338  |proj g|=       0.30354
At iterate    41  f =       82.333  |proj g|=       0.28668
At iterate    42  f =       82.321  |proj g|=       0.24732
At iterate    43  f =       82.309  |proj g|=       0.34561
At iterate    44  f =       82.295  |proj g|=       0.29314
At iterate    45  f =       82.283  |proj g|=        0.5463
At iterate    46  f =       82.269  |proj g|=       0.55403
At iterate    47  f =       82.266  |proj g|=       0.38142
At iterate    48  f =       82.264  |proj g|=       0.15815
At iterate    49  f =        82.26  |proj g|=       0.11062
At iterate    50  f =       82.258  |proj g|=        0.1582
At iterate    51  f =       82.255  |proj g|=       0.22033
At iterate    52  f =       82.254  |proj g|=       0.13105
At iterate    53  f =       82.253  |proj g|=       0.05804
At iterate    54  f =       82.253  |proj g|=       0.15167
At iterate    55  f =       82.253  |proj g|=      0.054998
At iterate    56  f =       82.252  |proj g|=       0.03075
At iterate    57  f =       82.252  |proj g|=      0.029696
At iterate    58  f =       82.252  |proj g|=      0.016543
At iterate    59  f =       82.252  |proj g|=      0.014205
At iterate    60  f =       82.252  |proj g|=      0.026848
At iterate    61  f =       82.252  |proj g|=      0.027097
At iterate    62  f =       82.252  |proj g|=      0.012538
At iterate    63  f =       82.252  |proj g|=      0.011962
At iterate    64  f =       82.252  |proj g|=      0.011229
At iterate    65  f =       82.252  |proj g|=       0.01993
At iterate    66  f =       82.252  |proj g|=      0.012827
At iterate    67  f =       82.252  |proj g|=      0.016769
At iterate    68  f =       82.252  |proj g|=      0.038307
At iterate    69  f =       82.252  |proj g|=       0.02021
At iterate    70  f =       82.252  |proj g|=       0.01395
At iterate    71  f =       82.252  |proj g|=      0.019049
At iterate    72  f =       82.252  |proj g|=      0.028594
At iterate    73  f =       82.252  |proj g|=      0.033337
At iterate    74  f =       82.252  |proj g|=      0.020535
At iterate    75  f =       82.252  |proj g|=     0.0075909
At iterate    76  f =       82.252  |proj g|=     0.0055178
At iterate    77  f =       82.252  |proj g|=      0.033389
At iterate    78  f =       82.252  |proj g|=     0.0071442
At iterate    79  f =       82.252  |proj g|=        0.0111
At iterate    80  f =       82.252  |proj g|=       0.01729
At iterate    81  f =       82.252  |proj g|=       0.01571
At iterate    82  f =       82.252  |proj g|=      0.029493
At iterate    83  f =       82.252  |proj g|=     0.0070285
At iterate    84  f =       82.252  |proj g|=     0.0084202
At iterate    85  f =       82.252  |proj g|=      0.012163
At iterate    86  f =       82.252  |proj g|=      0.089832
At iterate    87  f =       82.252  |proj g|=       0.03557
At iterate    88  f =       82.252  |proj g|=      0.010387
At iterate    89  f =       82.252  |proj g|=       0.02101
At iterate    90  f =       82.252  |proj g|=      0.017472
At iterate    91  f =       82.252  |proj g|=      0.025682
At iterate    92  f =       82.252  |proj g|=     0.0079639
At iterate    93  f =       82.252  |proj g|=     0.0073904
At iterate    94  f =       82.252  |proj g|=      0.018008
At iterate    95  f =       82.252  |proj g|=     0.0062852
At iterate    96  f =       82.252  |proj g|=     0.0046032
At iterate    97  f =       82.252  |proj g|=     0.0028965
At iterate    98  f =       82.251  |proj g|=     0.0083294
At iterate    99  f =       82.251  |proj g|=      0.004218
At iterate   100  f =       82.251  |proj g|=     0.0024721
At iterate   101  f =       82.251  |proj g|=     0.0026606
final  value 82.251495 
stopped after 101 iterations

optimisation start
------------------
* estimation method   : MLE 
* optimisation method : BFGS 
* analytical gradient : used
* trend model : ~alpha_io + a_wl_io + bio_hum_cn + b_wl_io + dcatch_dlai_io + 
    dqcrit_io + dz0v_dh_io + f0_io + fd_io + g_area_io + g_root_io + 
    g_wood_io + gs_nvg_io + hw_sw_io + kaps_roth + knl_io + lai_max_io + 
    lai_min_io + lma_io + n_inorg_turnover + nmass_io + nr_io + 
    retran_l_io + retran_r_io + r_grow_io + rootd_ft_io + sigl_io + 
    sorp + tleaf_of_io + tlow_io + tupp_io + l_vg_soil
* covariance model : 
  - type :  matern5_2 
  - nugget : NO
  - parameters lower bounds :  1e-10 1e-10 1e-10 1e-10 1e-10 1e-10 1e-10 1e-10 1e-10 1e-10 1e-10 1e-10 1e-10 1e-10 1e-10 1e-10 1e-10 1e-10 1e-10 1e-10 1e-10 1e-10 1e-10 1e-10 1e-10 1e-10 1e-10 1e-10 1e-10 1e-10 1e-10 1e-10 
  - parameters upper bounds :  2 2 1.999244 1.698141 1.994798 1.990622 1.998154 1.778477 2 2 2 1.998084 2 2 2 1.99598 2 1.989889 1.997502 1.989483 1.98997 1.987916 1.983347 1.988424 2 1.990947 1.995643 1.994232 1.992247 2 2 2 
  - best initial criterion value(s) :  -1383.375 

N = 32, M = 5 machine precision = 2.22045e-16
At X0, 0 variables are exactly at the bounds
At iterate     0  f=       1383.4  |proj g|=       1.7664
At iterate     1  f =       1372.9  |proj g|=        1.6648
At iterate     2  f =       1364.8  |proj g|=        1.7747
At iterate     3  f =       1356.7  |proj g|=        1.8961
At iterate     4  f =       1350.1  |proj g|=        1.7144
At iterate     5  f =       1347.8  |proj g|=        1.6582
At iterate     6  f =       1341.7  |proj g|=         1.481
At iterate     7  f =       1337.6  |proj g|=        1.6235
At iterate     8  f =       1335.4  |proj g|=        1.4778
At iterate     9  f =         1334  |proj g|=       0.92855
At iterate    10  f =         1332  |proj g|=        1.5095
At iterate    11  f =       1330.6  |proj g|=        1.0917
At iterate    12  f =       1329.3  |proj g|=        1.2354
At iterate    13  f =       1328.5  |proj g|=       0.82781
At iterate    14  f =       1328.3  |proj g|=        0.9746
At iterate    15  f =       1328.1  |proj g|=       0.55288
At iterate    16  f =         1328  |proj g|=       0.39538
At iterate    17  f =       1327.8  |proj g|=       0.30206
At iterate    18  f =       1327.8  |proj g|=        1.4645
At iterate    19  f =       1327.8  |proj g|=       0.56521
At iterate    20  f =       1327.8  |proj g|=       0.21692
At iterate    21  f =       1327.8  |proj g|=       0.56111
At iterate    22  f =       1327.8  |proj g|=       0.51424
At iterate    23  f =       1327.8  |proj g|=       0.53842
At iterate    24  f =       1327.8  |proj g|=        0.1763
At iterate    25  f =       1327.7  |proj g|=       0.20315
At iterate    26  f =       1327.7  |proj g|=       0.14516
At iterate    27  f =       1327.7  |proj g|=      0.054732
At iterate    28  f =       1327.7  |proj g|=      0.084036
At iterate    29  f =       1327.7  |proj g|=      0.045267
At iterate    30  f =       1327.7  |proj g|=      0.046735
At iterate    31  f =       1327.7  |proj g|=       0.14927
At iterate    32  f =       1327.7  |proj g|=       0.11387
At iterate    33  f =       1327.7  |proj g|=      0.025094
At iterate    34  f =       1327.7  |proj g|=      0.018372
At iterate    35  f =       1327.7  |proj g|=      0.018539
At iterate    36  f =       1327.7  |proj g|=      0.017334
At iterate    37  f =       1327.7  |proj g|=      0.035245
At iterate    38  f =       1327.7  |proj g|=      0.016258
At iterate    39  f =       1327.7  |proj g|=     0.0075892
At iterate    40  f =       1327.7  |proj g|=      0.008652
At iterate    41  f =       1327.7  |proj g|=      0.023457

iterations 41
function evaluations 48
segments explored during Cauchy searches 62
BFGS updates skipped 0
active bounds at final generalized Cauchy point 20
norm of the final projected gradient 0.0234567
final function value 1327.74

F = 1327.74
final  value 1327.742870 
converged

optimisation start
------------------
* estimation method   : MLE 
* optimisation method : BFGS 
* analytical gradient : used
* trend model : ~alpha_io + a_wl_io + bio_hum_cn + b_wl_io + dcatch_dlai_io + 
    dqcrit_io + dz0v_dh_io + f0_io + fd_io + g_area_io + g_root_io + 
    g_wood_io + gs_nvg_io + hw_sw_io + kaps_roth + knl_io + lai_max_io + 
    lai_min_io + lma_io + n_inorg_turnover + nmass_io + nr_io + 
    retran_l_io + retran_r_io + r_grow_io + rootd_ft_io + sigl_io + 
    sorp + tleaf_of_io + tlow_io + tupp_io + l_vg_soil
* covariance model : 
  - type :  matern5_2 
  - nugget : NO
  - parameters lower bounds :  1e-10 1e-10 1e-10 1e-10 1e-10 1e-10 1e-10 1e-10 1e-10 1e-10 1e-10 1e-10 1e-10 1e-10 1e-10 1e-10 1e-10 1e-10 1e-10 1e-10 1e-10 1e-10 1e-10 1e-10 1e-10 1e-10 1e-10 1e-10 1e-10 1e-10 1e-10 1e-10 
  - parameters upper bounds :  2 2 1.999244 1.698141 1.994798 1.990622 1.998154 1.778477 2 2 2 1.998084 2 2 2 1.99598 2 1.989889 1.997502 1.989483 1.98997 1.987916 1.983347 1.988424 2 1.990947 1.995643 1.994232 1.992247 2 2 2 
  - best initial criterion value(s) :  -2561.221 

N = 32, M = 5 machine precision = 2.22045e-16
At X0, 0 variables are exactly at the bounds
At iterate     0  f=       2561.2  |proj g|=       1.8661
At iterate     1  f =       2533.6  |proj g|=             2
At iterate     2  f =       2519.6  |proj g|=             2
At iterate     3  f =       2516.5  |proj g|=        1.9534
At iterate     4  f =       2510.4  |proj g|=        1.7867
At iterate     5  f =         2505  |proj g|=        1.6826
At iterate     6  f =       2501.5  |proj g|=         1.618
At iterate     7  f =       2494.2  |proj g|=        1.3844
At iterate     8  f =       2492.2  |proj g|=        1.6032
At iterate     9  f =       2491.3  |proj g|=         1.589
At iterate    10  f =       2488.9  |proj g|=          1.53
At iterate    11  f =       2487.5  |proj g|=        1.0728
At iterate    12  f =       2487.2  |proj g|=        1.0711
At iterate    13  f =         2487  |proj g|=        1.1027
At iterate    14  f =       2486.8  |proj g|=       0.47609
At iterate    15  f =       2486.8  |proj g|=       0.42024
At iterate    16  f =       2486.8  |proj g|=        1.2305
At iterate    17  f =       2486.8  |proj g|=       0.38381
At iterate    18  f =       2486.8  |proj g|=       0.22702
At iterate    19  f =       2486.8  |proj g|=       0.21667
At iterate    20  f =       2486.8  |proj g|=       0.17646
At iterate    21  f =       2486.7  |proj g|=         0.202
At iterate    22  f =       2486.7  |proj g|=       0.44121
At iterate    23  f =       2486.7  |proj g|=       0.16229
At iterate    24  f =       2486.7  |proj g|=      0.066349
At iterate    25  f =       2486.7  |proj g|=      0.018863
At iterate    26  f =       2486.7  |proj g|=      0.034152
At iterate    27  f =       2486.7  |proj g|=      0.043297
At iterate    28  f =       2486.7  |proj g|=      0.014902
At iterate    29  f =       2486.7  |proj g|=      0.016268
At iterate    30  f =       2486.7  |proj g|=      0.013669
At iterate    31  f =       2486.7  |proj g|=      0.021967

iterations 31
function evaluations 34
segments explored during Cauchy searches 54
BFGS updates skipped 0
active bounds at final generalized Cauchy point 25
norm of the final projected gradient 0.0219674
final function value 2486.74

F = 2486.74
final  value 2486.744525 
converged

optimisation start
------------------
* estimation method   : MLE 
* optimisation method : BFGS 
* analytical gradient : used
* trend model : ~alpha_io + a_wl_io + bio_hum_cn + b_wl_io + dcatch_dlai_io + 
    dqcrit_io + dz0v_dh_io + f0_io + fd_io + g_area_io + g_root_io + 
    g_wood_io + gs_nvg_io + hw_sw_io + kaps_roth + knl_io + lai_max_io + 
    lai_min_io + lma_io + n_inorg_turnover + nmass_io + nr_io + 
    retran_l_io + retran_r_io + r_grow_io + rootd_ft_io + sigl_io + 
    sorp + tleaf_of_io + tlow_io + tupp_io + l_vg_soil
* covariance model : 
  - type :  matern5_2 
  - nugget : NO
  - parameters lower bounds :  1e-10 1e-10 1e-10 1e-10 1e-10 1e-10 1e-10 1e-10 1e-10 1e-10 1e-10 1e-10 1e-10 1e-10 1e-10 1e-10 1e-10 1e-10 1e-10 1e-10 1e-10 1e-10 1e-10 1e-10 1e-10 1e-10 1e-10 1e-10 1e-10 1e-10 1e-10 1e-10 
  - parameters upper bounds :  2 2 1.999244 1.698141 1.994798 1.990622 1.998154 1.778477 2 2 2 1.998084 2 2 2 1.99598 2 1.989889 1.997502 1.989483 1.98997 1.987916 1.983347 1.988424 2 1.990947 1.995643 1.994232 1.992247 2 2 2 
  - best initial criterion value(s) :  -2315.205 

N = 32, M = 5 machine precision = 2.22045e-16
At X0, 0 variables are exactly at the bounds
At iterate     0  f=       2315.2  |proj g|=       1.9221
At iterate     1  f =       2314.2  |proj g|=        1.7645
At iterate     2  f =       2314.1  |proj g|=       0.74274
At iterate     3  f =       2313.9  |proj g|=        1.3088
At iterate     4  f =       2313.7  |proj g|=        1.9298
At iterate     5  f =       2313.5  |proj g|=        1.9378
At iterate     6  f =       2313.1  |proj g|=        1.9199
At iterate     7  f =         2312  |proj g|=        1.9412
At iterate     8  f =       2311.8  |proj g|=        1.9461
At iterate     9  f =       2310.4  |proj g|=        1.3481
At iterate    10  f =       2309.3  |proj g|=        1.2924
At iterate    11  f =       2308.7  |proj g|=         1.937
At iterate    12  f =       2308.3  |proj g|=        1.5008
At iterate    13  f =       2308.3  |proj g|=         1.216
At iterate    14  f =       2308.2  |proj g|=        1.8896
At iterate    15  f =       2308.1  |proj g|=        1.8935
At iterate    16  f =       2307.5  |proj g|=        1.9032
At iterate    17  f =         2307  |proj g|=        1.8988
At iterate    18  f =       2304.7  |proj g|=        1.0033
At iterate    19  f =       2303.6  |proj g|=        1.5714
At iterate    20  f =       2303.5  |proj g|=         1.917
At iterate    21  f =       2303.3  |proj g|=        1.9143
At iterate    22  f =       2303.2  |proj g|=        1.9086
At iterate    23  f =       2303.1  |proj g|=        1.8843
At iterate    24  f =       2302.9  |proj g|=       0.70255
At iterate    25  f =       2302.9  |proj g|=       0.68074
At iterate    26  f =       2302.9  |proj g|=        1.9109
At iterate    27  f =       2302.8  |proj g|=        1.7663
At iterate    28  f =       2302.8  |proj g|=       0.67488
At iterate    29  f =       2302.6  |proj g|=        1.0907
At iterate    30  f =       2302.3  |proj g|=        1.9095
At iterate    31  f =       2302.2  |proj g|=        1.9105
At iterate    32  f =         2302  |proj g|=        1.4736
At iterate    33  f =         2302  |proj g|=        1.4695
At iterate    34  f =       2301.8  |proj g|=          1.32
At iterate    35  f =       2301.7  |proj g|=          1.91
At iterate    36  f =       2301.7  |proj g|=        1.3149
At iterate    37  f =       2301.6  |proj g|=       0.83873
At iterate    38  f =       2301.5  |proj g|=       0.96389
At iterate    39  f =       2301.5  |proj g|=        1.3464
At iterate    40  f =       2301.4  |proj g|=       0.53138
At iterate    41  f =       2301.3  |proj g|=        1.8834
At iterate    42  f =       2301.3  |proj g|=       0.82272
At iterate    43  f =       2301.3  |proj g|=       0.75558
At iterate    44  f =       2301.3  |proj g|=        1.8803
At iterate    45  f =       2301.3  |proj g|=        1.8814
At iterate    46  f =       2301.3  |proj g|=        1.8812
At iterate    47  f =       2301.3  |proj g|=         1.881
At iterate    48  f =       2301.2  |proj g|=        1.3784
At iterate    49  f =       2301.2  |proj g|=       0.62431
At iterate    50  f =       2301.2  |proj g|=        1.9114
At iterate    51  f =       2301.2  |proj g|=        1.9123
At iterate    52  f =       2301.1  |proj g|=        1.9116
At iterate    53  f =       2301.1  |proj g|=       0.63241
At iterate    54  f =       2301.1  |proj g|=       0.28367
At iterate    55  f =       2301.1  |proj g|=       0.31082
At iterate    56  f =       2301.1  |proj g|=       0.62345
At iterate    57  f =       2301.1  |proj g|=         1.911
At iterate    58  f =       2301.1  |proj g|=        1.9119
At iterate    59  f =       2301.1  |proj g|=        1.9112
At iterate    60  f =         2301  |proj g|=       0.29321
At iterate    61  f =         2301  |proj g|=       0.31545
At iterate    62  f =         2301  |proj g|=       0.84934
At iterate    63  f =         2301  |proj g|=        1.8836
At iterate    64  f =         2301  |proj g|=        1.8821
At iterate    65  f =         2301  |proj g|=       0.58887
At iterate    66  f =         2301  |proj g|=        1.2003
At iterate    67  f =         2301  |proj g|=       0.43465
At iterate    68  f =         2301  |proj g|=       0.42034
At iterate    69  f =         2301  |proj g|=       0.60752
At iterate    70  f =         2301  |proj g|=        1.6659
At iterate    71  f =         2301  |proj g|=        1.8816
At iterate    72  f =       2300.9  |proj g|=        1.8816
At iterate    73  f =       2300.9  |proj g|=        1.8828
At iterate    74  f =       2300.9  |proj g|=        1.8811
At iterate    75  f =       2300.9  |proj g|=       0.40944
At iterate    76  f =       2300.9  |proj g|=       0.36834
At iterate    77  f =       2300.9  |proj g|=       0.74183
At iterate    78  f =       2300.9  |proj g|=        1.6322
At iterate    79  f =       2300.9  |proj g|=         1.914
At iterate    80  f =       2300.9  |proj g|=        1.9141
At iterate    81  f =       2300.9  |proj g|=        1.9155
At iterate    82  f =       2300.9  |proj g|=        1.1075
At iterate    83  f =       2300.8  |proj g|=       0.97412
At iterate    84  f =       2300.8  |proj g|=       0.96614
At iterate    85  f =       2300.8  |proj g|=        1.8816
At iterate    86  f =       2300.8  |proj g|=        1.8815
At iterate    87  f =       2300.8  |proj g|=        1.9143
At iterate    88  f =       2300.7  |proj g|=       0.61654
At iterate    89  f =       2300.7  |proj g|=       0.61993
At iterate    90  f =       2300.7  |proj g|=       0.61744
At iterate    91  f =       2300.7  |proj g|=       0.59652
At iterate    92  f =       2300.7  |proj g|=       0.47719
At iterate    93  f =       2300.7  |proj g|=       0.53494
At iterate    94  f =       2300.7  |proj g|=       0.53394
At iterate    95  f =       2300.7  |proj g|=       0.52042
At iterate    96  f =       2300.7  |proj g|=       0.60048
At iterate    97  f =       2300.7  |proj g|=        1.9142
At iterate    98  f =       2300.7  |proj g|=        1.9152
At iterate    99  f =       2300.6  |proj g|=        1.9161
At iterate   100  f =       2300.6  |proj g|=        1.9168
At iterate   101  f =       2300.6  |proj g|=        1.3656
final  value 2300.595796 
stopped after 101 iterations

Visualise the predicted outputs at the NROY points of the old design, and the new suggested design.

5.7 Visualising the emulated outputs at the proposed new design points.

Interestingly, these aren’t perfectly within the original hard boundaries set by Andy, even though I’ve set those boundaries to be the +- 4 standard deviation threholds in the History Match. I suggest this is because there is model discrepancy, and that there is considerable wriggle room induced from emulator uncertainty.

In particular, it appears that vegetation carbon is difficult to keep high, and that many NROY proposed members have a fairly low vegetation carbon. This might need a discrepancy term, or adjusting in some other way. It certainly needs exploring, and a OAAT plot might give clues as to the parameters to choose.

How good are the four emulators that we’ve built? Are there biases? (there’s no real evidence of this)

5.8 One-at-a-time sensitivity analysis for understanding model response

It’s obviously hard to maintain a high vegetation carbon in particular. What parameter values might you choose to do this, and what might be the trade-offs you have to make?

First, what parameters affect vegetation carbon and how? How sure are we about that?

some values will be clipped

What might be the trade-offs for a high (or accurate) vegetation carbon? are they acceptable? Plot the oaat sensitivity of the other 3 outputs we’re calibrating on.

What do the emulators make of the design points which actually make Andy’s “hard boundary” criteria? If we leave them out, do they still place the output within the hard boundaries?

5.9 Check the emulators that produce the new design

Do a leave-one-out cross validation of points inside the hard boundaries using the wave1 fits.

We see in the leave-one-out analysis that the emulator is consistently under-predicting the vegetation carbon (though the uncertainty estimate often covers the actual value).This suggests (1) that there isn’t really a huge problem with a model discrepancy (or at least that isn’t the only problem), and (2) the history matching is working as it should, and taking into account a not-great emulator.

5.10 Compare the straight km with a two-step emulator

Is a two-step emulator any better at emulating those crucial points which fall within aw’s hard boundaries? First, create a list of emulator fits.

It doesn’t appear that the two-step emulator (here plotted in red) is doing any better than the regular emulator.

Two other things I can think of to check: 1) how about using “multistart” to choose different starting conditions for optimising the emulators and 2) Using a flat prior for the mean function rather than a linear prior.

Loading required package: Matrix

Attaching package: ‘Matrix’

The following object is masked from ‘package:spam’:

    det

Loaded glmnet 4.1-1

6 Exploring new constraints

Input from Eddy Robertson:

“We can assume that the majority of vegetation carbon is stored in tree trunks so, the carbon density of trees is approximately (cVeg_lnd_mean / treeFrac_lnd_mean). Although I suppose it’s possible that in the PPE the shrubs have become tree-like, so it might be interesting to plot cVeg_lnd_mean versus (shrubFrac_lnd_mean + treeFrac_lnd_mean) as well. The first question is whether cVeg_lnd_mean increases linearly with treeFrac_lnd_mean. Then if this turned out to be interesting, we could produce a treeCVeg_lnd_mean output.”


optimisation start
------------------
* estimation method   : MLE 
* optimisation method : BFGS 
* analytical gradient : used
* trend model : ~1
* covariance model : 
  - type :  matern5_2 
  - nugget : NO
  - parameters lower bounds :  1e-10 1e-10 1e-10 1e-10 1e-10 1e-10 1e-10 1e-10 1e-10 1e-10 1e-10 1e-10 1e-10 1e-10 1e-10 1e-10 1e-10 1e-10 1e-10 1e-10 1e-10 1e-10 1e-10 1e-10 1e-10 1e-10 1e-10 1e-10 1e-10 1e-10 1e-10 1e-10 
  - parameters upper bounds :  2 2 1.999244 1.698141 1.994798 1.990622 1.998154 1.778477 2 2 2 1.998084 2 2 2 1.99598 2 1.989889 1.997502 1.989483 1.98997 1.987916 1.983347 1.988424 2 1.990947 1.995643 1.994232 1.992247 2 2 2 
  - best initial criterion value(s) :  -324.7357 

N = 32, M = 5 machine precision = 2.22045e-16
At X0, 0 variables are exactly at the bounds
At iterate     0  f=       324.74  |proj g|=       1.8894
At iterate     1  f =       154.68  |proj g|=             2
At iterate     2  f =       144.37  |proj g|=        1.9477
At iterate     3  f =       140.12  |proj g|=        1.8272
At iterate     4  f =       137.65  |proj g|=        1.5752
At iterate     5  f =       135.35  |proj g|=        1.4243
At iterate     6  f =       134.81  |proj g|=        1.1667
At iterate     7  f =       134.52  |proj g|=        1.0068
At iterate     8  f =       134.47  |proj g|=       0.55475
At iterate     9  f =       134.44  |proj g|=       0.37207
At iterate    10  f =       134.43  |proj g|=       0.20987
At iterate    11  f =       134.42  |proj g|=      0.076796
At iterate    12  f =       134.42  |proj g|=      0.026753
At iterate    13  f =       134.42  |proj g|=       0.01759
At iterate    14  f =       134.42  |proj g|=     0.0060535
At iterate    15  f =       134.42  |proj g|=     0.0041787
At iterate    16  f =       134.42  |proj g|=     0.0021465
At iterate    17  f =       134.42  |proj g|=       0.00377
At iterate    18  f =       134.42  |proj g|=      0.001123
At iterate    19  f =       134.42  |proj g|=    0.00021622

iterations 19
function evaluations 20
segments explored during Cauchy searches 42
BFGS updates skipped 0
active bounds at final generalized Cauchy point 19
norm of the final projected gradient 0.000216221
final function value 134.421

F = 134.421
final  value 134.420708 
converged

optimisation start
------------------
* estimation method   : MLE 
* optimisation method : BFGS 
* analytical gradient : used
* trend model : ~1
* covariance model : 
  - type :  matern5_2 
  - nugget : NO
  - parameters lower bounds :  1e-10 1e-10 1e-10 1e-10 1e-10 1e-10 1e-10 1e-10 1e-10 1e-10 1e-10 1e-10 1e-10 1e-10 1e-10 1e-10 1e-10 1e-10 1e-10 1e-10 1e-10 1e-10 1e-10 1e-10 1e-10 1e-10 1e-10 1e-10 1e-10 1e-10 1e-10 1e-10 
  - parameters upper bounds :  2 2 1.999244 1.698141 1.994798 1.990622 1.998154 1.778477 2 2 2 1.998084 2 2 2 1.99598 2 1.989889 1.997502 1.989483 1.98997 1.987916 1.983347 1.988424 2 1.990947 1.995643 1.994232 1.992247 2 2 2 
  - best initial criterion value(s) :  -1621.762 

N = 32, M = 5 machine precision = 2.22045e-16
At X0, 0 variables are exactly at the bounds
At iterate     0  f=       1621.8  |proj g|=       1.7706
At iterate     1  f =       1507.2  |proj g|=        1.4766
At iterate     2  f =       1423.3  |proj g|=        1.7768
At iterate     3  f =       1418.6  |proj g|=        1.4019
At iterate     4  f =       1415.9  |proj g|=        1.6446
At iterate     5  f =       1415.3  |proj g|=        1.7139
At iterate     6  f =       1415.1  |proj g|=        1.6554
At iterate     7  f =       1414.8  |proj g|=        1.4108
At iterate     8  f =       1414.7  |proj g|=       0.99795
At iterate     9  f =       1414.5  |proj g|=       0.73402
At iterate    10  f =       1414.5  |proj g|=       0.66567
At iterate    11  f =       1414.5  |proj g|=       0.13919
At iterate    12  f =       1414.5  |proj g|=        0.0858
At iterate    13  f =       1414.5  |proj g|=      0.034268
At iterate    14  f =       1414.5  |proj g|=      0.063708
At iterate    15  f =       1414.5  |proj g|=      0.010821
At iterate    16  f =       1414.5  |proj g|=     0.0075671
At iterate    17  f =       1414.5  |proj g|=      0.012372
At iterate    18  f =       1414.5  |proj g|=     0.0071278
At iterate    19  f =       1414.5  |proj g|=     0.0036723

iterations 19
function evaluations 21
segments explored during Cauchy searches 70
BFGS updates skipped 0
active bounds at final generalized Cauchy point 25
norm of the final projected gradient 0.00367225
final function value 1414.5

F = 1414.5
final  value 1414.500017 
converged

optimisation start
------------------
* estimation method   : MLE 
* optimisation method : BFGS 
* analytical gradient : used
* trend model : ~1
* covariance model : 
  - type :  matern5_2 
  - nugget : NO
  - parameters lower bounds :  1e-10 1e-10 1e-10 1e-10 1e-10 1e-10 1e-10 1e-10 1e-10 1e-10 1e-10 1e-10 1e-10 1e-10 1e-10 1e-10 1e-10 1e-10 1e-10 1e-10 1e-10 1e-10 1e-10 1e-10 1e-10 1e-10 1e-10 1e-10 1e-10 1e-10 1e-10 1e-10 
  - parameters upper bounds :  2 2 1.999244 1.698141 1.994798 1.990622 1.998154 1.778477 2 2 2 1.998084 2 2 2 1.99598 2 1.989889 1.997502 1.989483 1.98997 1.987916 1.983347 1.988424 2 1.990947 1.995643 1.994232 1.992247 2 2 2 
  - best initial criterion value(s) :  -2800.645 

N = 32, M = 5 machine precision = 2.22045e-16
At X0, 0 variables are exactly at the bounds
At iterate     0  f=       2800.6  |proj g|=       1.8463
At iterate     1  f =       2616.7  |proj g|=        1.6218
At iterate     2  f =       2605.4  |proj g|=         1.553
At iterate     3  f =       2583.7  |proj g|=        1.6224
At iterate     4  f =       2577.2  |proj g|=         1.011
At iterate     5  f =         2573  |proj g|=        1.3781
At iterate     6  f =       2571.3  |proj g|=         1.308
At iterate     7  f =       2571.1  |proj g|=        0.9583
At iterate     8  f =         2571  |proj g|=       0.62272
At iterate     9  f =       2570.9  |proj g|=       0.44321
At iterate    10  f =       2570.9  |proj g|=       0.12021
At iterate    11  f =       2570.9  |proj g|=      0.055708
At iterate    12  f =       2570.9  |proj g|=      0.016351
At iterate    13  f =       2570.9  |proj g|=     0.0027779

iterations 13
function evaluations 16
segments explored during Cauchy searches 52
BFGS updates skipped 0
active bounds at final generalized Cauchy point 27
norm of the final projected gradient 0.00277786
final function value 2570.93

F = 2570.93
final  value 2570.925355 
converged

optimisation start
------------------
* estimation method   : MLE 
* optimisation method : BFGS 
* analytical gradient : used
* trend model : ~1
* covariance model : 
  - type :  matern5_2 
  - nugget : NO
  - parameters lower bounds :  1e-10 1e-10 1e-10 1e-10 1e-10 1e-10 1e-10 1e-10 1e-10 1e-10 1e-10 1e-10 1e-10 1e-10 1e-10 1e-10 1e-10 1e-10 1e-10 1e-10 1e-10 1e-10 1e-10 1e-10 1e-10 1e-10 1e-10 1e-10 1e-10 1e-10 1e-10 1e-10 
  - parameters upper bounds :  2 2 1.999244 1.698141 1.994798 1.990622 1.998154 1.778477 2 2 2 1.998084 2 2 2 1.99598 2 1.989889 1.997502 1.989483 1.98997 1.987916 1.983347 1.988424 2 1.990947 1.995643 1.994232 1.992247 2 2 2 
  - best initial criterion value(s) :  -2465.963 

N = 32, M = 5 machine precision = 2.22045e-16
At X0, 0 variables are exactly at the bounds
At iterate     0  f=         2466  |proj g|=       1.7876
At iterate     1  f =       2357.6  |proj g|=             2
At iterate     2  f =       2342.2  |proj g|=             2
At iterate     3  f =       2334.4  |proj g|=        1.9202
At iterate     4  f =       2331.2  |proj g|=        1.8804
At iterate     5  f =         2325  |proj g|=        1.7272
At iterate     6  f =         2322  |proj g|=        1.6469
At iterate     7  f =       2320.5  |proj g|=        1.4532
At iterate     8  f =       2317.5  |proj g|=        1.4216
At iterate     9  f =         2317  |proj g|=        1.3362
At iterate    10  f =       2316.1  |proj g|=        1.2141
At iterate    11  f =       2315.5  |proj g|=        1.1842
At iterate    12  f =       2315.4  |proj g|=       0.93199
At iterate    13  f =       2315.4  |proj g|=        0.5059
At iterate    14  f =       2315.4  |proj g|=       0.38256
At iterate    15  f =       2315.4  |proj g|=       0.53325
At iterate    16  f =       2315.4  |proj g|=       0.18709
At iterate    17  f =       2315.4  |proj g|=      0.038636
At iterate    18  f =       2315.4  |proj g|=       0.02819
At iterate    19  f =       2315.4  |proj g|=      0.033483
At iterate    20  f =       2315.4  |proj g|=      0.015972
At iterate    21  f =       2315.4  |proj g|=      0.014807
At iterate    22  f =       2315.4  |proj g|=     0.0076813
At iterate    23  f =       2315.4  |proj g|=     0.0071707

iterations 23
function evaluations 27
segments explored during Cauchy searches 50
BFGS updates skipped 0
active bounds at final generalized Cauchy point 21
norm of the final projected gradient 0.00717074
final function value 2315.38

F = 2315.38
final  value 2315.375074 
converged

Is the range of carbon densities narrower in the “hard boundary” set?

6.1 Now that we have constraints, we can explore their effect on the output

6.2 How much does constraining an output constrain other outputs?

For example, what effect has the AW “hard boundary” constraint produced on ranges of the other (marginal) outputs? Which constraint is doing the majority of the work?

A function to find the proportion of output space that is removed (or retained) when applying a constraint.

All constraints together take the normalized range of all the outputs to a little under a half of the original range, on average. Of course, four of the inputs are constrained here, which has quite a large impact.

We can see what impacts the constraints have individually

The NBP constraint has no marginal impact

Vegetation carbon (cVeg) has the strongest impact on everything else. This is no suprise, given that so few of the ensemble members seem to simulate carbon vegetation high enough.

6.3 Writing robust, parallelised, multistart emulators

7 Direct twoStep emulator using foreach

LS0tCnRpdGxlOiAiU2Vuc2l0aXZpdHkgYW5hbHlzaXMgYW5kIGNvbnN0cmFpbnQgb2YgdGhlIHBhcmFtZXRlciBzcGFjZSBvZiBFYXJ0aCBTeXN0ZW0gY29uZmlndXJhdGlvbiBvZiBKVUxFUyIKYXV0aG9yOiAiRG91ZyBNY05lYWxsIgpkYXRlOiAiMjQvMDMvMjAyMSIKb3V0cHV0OiAKICAgIGh0bWxfbm90ZWJvb2s6CiAgICAgICAgdG9jOiB0cnVlCiAgICAgICAgdG9jX2Zsb2F0OiB0cnVlCiAgICAgICAgdG9jX2RlcHRoOiAzCiAgICAgICAgbnVtYmVyX3NlY3Rpb25zOiB0cnVlCi0tLQoKIyBJbnRyb2R1Y3Rpb24KVXBkYXRlIG9mIGV4cGxvcmUtSlVMRVMtRVMtMXAwLlJtZCB0aGF0IHVzZXMgdGhlIG5ldyBwYWNrYWdlcyBhbmQgZnVuY3Rpb25zCgpXZSBidWlsZCBhbmQgdGVzdCBnYXVzc2lhbiBwcm9jZXNzIGVtdWxhdG9ycywgcGVyZm9ybSBhIHNlbnNpdGl2aXR5IGFuYWx5aXMsIGFuZCBjb25zdHJhaW4gdGhlIGlucHV0IHNwYWNlIG9mIEp1bGVzLgoKCkFuZHkgdGhpbmtzIHRoZXJlIG1pZ2h0IGJlIG1pbGVhZ2UgaW4gYW5hbHlzaW5nIHRoZSBhdG1vc3BoZXJpYyBncm93dGgsIHdoaWNoIGlzIGhlcmUuCi9ob21lL2gwMS9oYWRhdy9SZXNlYXJjaC9FU19QUEUvT2N0MjAKICAKQXQgdGhlIG1vbWVudCwgdGhpcyB2aWduZXR0ZSBpcyBoYW1wZXJlZCBieSB0aGUgZmFjdCB0aGF0IGVtdWxhdG9ycyBhcmUgZmFpbGluZyBvbiBhIGZldyBvZiB0aGUgb3V0cHV0cyB3aGljaCByZXByZXNlbnQgY2hhbmdlIG92ZXIgdGhlIGhpc3RvcmljYWwgcGVyaW9kLiBUaGUgZW11bGF0b3IgaXMgZmluZSBmb3IgcHJlZGljdGluZyBhYnNvbHV0ZSB2YWx1ZXMgaW4gdGhlIG1vZGVybiBwZXJpb2QuCgpBbmR5IHdvdWxkIGxpa2UgdG8gc2VlIHRpbWVzZXJpZXMgb2Y6CmNWZWcsIGNTb2lsIGFuZCBuYnAsIG5wcCBpbiBHdEMgYW5kIEd0Qy95ci4KCiMjIFByZWxpbWluYXJpZXMKTG9hZCBsaWJyYXJpZXMsIGZ1bmN0aW9ucyBhbmQgZGF0YS4KCmBgYHtyLCBlY2hvID0gVFJVRSwgbWVzc2FnZSA9IEZBTFNFLCB3YXJuaW5nPUZBTFNFfQojIExvYWQgaGVscGVyIGZ1bmN0aW9ucwoKa25pdHI6Om9wdHNfY2h1bmskc2V0KGZpZy5wYXRoID0gImZpZ3MvIiwgZWNobyA9IEZBTFNFLCBtZXNzYWdlID0gRkFMU0UsIHdhcm5pbmdzID0gRkFMU0UpCiMgbG9hZCBzb21lIGhlbHBlciBmdW5jdGlvbnMKc291cmNlKCd+L2JyYXppbENTU1AvY29kZS9icmF6aWxfY3NzcC9wZXJfcGZ0LlInKSAjIGV2ZW50dWFsbHksIG1vdmUgdGhlIHJlbGV2YW50IGZ1bmN0aW9ucwpzb3VyY2UoJ2V4cGxvcmUtSlVMRVMtRVMtMXAwX1BQRV9mdW5jdGlvbnMuUicpCmBgYAoKYGBge3IsIG1lc3NhZ2UgPSBGQUxTRSwgd2FybmluZz1GQUxTRX0KIyBMb2FkIHBhY2thZ2VzCgpsaWJyYXJ5KFJDb2xvckJyZXdlcikKbGlicmFyeShmaWVsZHMpCmxpYnJhcnkoTUFTUykKbGlicmFyeShEaWNlS3JpZ2luZykKbGlicmFyeShEaWNlRXZhbCkKbGlicmFyeShuY2RmNCkKbGlicmFyeShuY2RmNC5oZWxwZXJzKQpsaWJyYXJ5KHJlYWR4bCkKCmxpYnJhcnkoZm9yZWFjaCkKCmxpYnJhcnkoZW10b29scykKbGlicmFyeShpbXB0b29scykKbGlicmFyeSh2aXp0b29scykKbGlicmFyeShqdWxlc1IpCgoKYGBgCgoKYGBge3J9CiMgU29tZSBwYWxsZXRlIG9wdGlvbnMKeWcgPSBicmV3ZXIucGFsKDksICJZbEduIikKcnliID0gYnJld2VyLnBhbCgxMSwgIlJkWWxCdSIpCmJ5ciA9IHJldihyeWIpCnJiID0gYnJld2VyLnBhbCgxMSwgIlJkQnUiKQpiciA9IHJldihyYikKYmx1ZXMgPSBicmV3ZXIucGFsKDksICdCbHVlcycpCmNiUGFsIDwtIGMoIiMwMDAwMDAiLCAiI0U2OUYwMCIsICIjNTZCNEU5IiwgIiMwMDlFNzMiLCAiI0YwRTQ0MiIsICIjMDA3MkIyIiwgIiNENTVFMDAiLCAiI0NDNzlBNyIpCgp5c2VjID0gNjAqNjAqMjQqMzY1CnllYXJzIDwtIDE4NTA6MjAxMwpgYGAKCiMjIENhcmJvbiBidWRnZXQgZGF0YQoKW1NlY3Rpb24gMi41IGluIEZyaWVkbGluZ3N0ZWluIGV0IGFsLl0oaHR0cHM6Ly9lc3NkLmNvcGVybmljdXMub3JnL2FydGljbGVzLzEyLzMyNjkvMjAyMC8jc2VjdGlvbjIpIGRlc2NyaWJlcyBob3cgdGhlIGxhbmQgY2FyYm9uIHNpbmsgaXMgZXN0aW1hdGVkLgpgYGB7ciwgaGlzdG9yaWNhbC1jYXJib24tYnVkZ2V0LCB3YXJuaW5nID0gRkFMU0UsIGZpZy53aWR0aCA9IDgsIGZpZy5oZWlnaHQgPSA5fQoKCiMgUXVlc3Rpb246IEhvdyBjbG9zZWx5IHNob3VsZCBvdXIgbW9kZWwgbWF0Y2ggdGhpcyBjdXJ2ZT8gV2hpY2ggb3V0cHV0PwojIChNeSBndWVzcyBpcyAnVG90YWwgTGFuZCBDYXJib24gYW5vbWFseScpCmhpc3RvcmljYWxfY2FyYm9uX2J1ZGdldCA8LSByZWFkX2V4Y2VsKCdHbG9iYWxfQ2FyYm9uX0J1ZGdldF8yMDIwdjEuMC54bHN4Jywgc2hlZXQgPSAiSGlzdG9yaWNhbCBCdWRnZXQiLCBza2lwID0gMTUpCgpwYXIobWZyb3cgPSBjKDMsMSkpCnlsaW0gPSBjKC0xLCA2KQoKcGxvdChoaXN0b3JpY2FsX2NhcmJvbl9idWRnZXQkWWVhciwgaGlzdG9yaWNhbF9jYXJib25fYnVkZ2V0JGBsYW5kIHNpbmtgLCB0eXBlID0gJ2wnLCBidHkgPSAnbicsIHlsaW0gPSB5bGltKQoKcGxvdChoaXN0b3JpY2FsX2NhcmJvbl9idWRnZXQkWWVhciwgaGlzdG9yaWNhbF9jYXJib25fYnVkZ2V0JGBsYW5kLXVzZSBjaGFuZ2UgZW1pc3Npb25zYCwgdHlwZSA9ICdsJywgYnR5ID0gJ24nLCB5bGltID0geWxpbSkKCnBsb3QoaGlzdG9yaWNhbF9jYXJib25fYnVkZ2V0JFllYXIsIGhpc3RvcmljYWxfY2FyYm9uX2J1ZGdldCRgYXRtb3NwaGVyaWMgZ3Jvd3RoYCwgdHlwZSA9ICdsJywgYnR5ID0gJ24nLCB5bGltID0geWxpbSkKCgoKYGBgCgoKCgojIyMgSnVsZXMgb3V0cHV0IGRhdGEgbG9jYXRpb24KYGBge3IsIGxvYWQtb3V0cHV0LWVuc2VtYmxlfQoKZW5zbG9jIDwtICcvcHJvamVjdC9jYXJib25fcHBlL0pVTEVTLUVTLTFwMF9QUEUvJwplbnNtZW1iZXIgPC0gJ1AwMDAwLycKc3ViZGlyIDwtICdzdGF0cy8nCgpmbG9jIDwtIHBhc3RlMChlbnNsb2MsZW5zbWVtYmVyLHN1YmRpcikKZm4gPC0gJ0pVTEVTLUVTLTFwMF9QMDAwMF9Bbm51YWxfZ2xvYmFsLm5jJwoKIyB0ZXN0IGZpbGUKbmMgPC0gbmNfb3BlbihwYXN0ZTAoZmxvYyxmbikpCgojIFdoYXQgdmFyaWFibGVzIGFyZSBpbiB0aGUgZmlsZT8gCnZhcmxpc3QgPC0gbmMuZ2V0LnZhcmlhYmxlLmxpc3QobmMpCgoKZm9yKGkgaW4gMTpsZW5ndGgodmFybGlzdCkpewogIAogIHZhciA8LSB2YXJsaXN0W2ldCiAgcHJpbnQodmFyKQogIHByaW50KG5jYXR0X2dldChuYyx2YXIsImxvbmdfbmFtZSIpW1syXV0pCn0KYGBgCgojIyBFeHRyYWN0IGEgdGltZSBzZXJpZXMgb2YgYW4gYW5udWFsLCBnbG9iYWxseSBhZ2dyZWdhdGVkIHZhcmlhYmxlCmBgYHtyLCBleHRhcmN0LXRpbWUtc2VyaWVzfQoKZXh0cmFjdFRpbWVzZXJpZXMgPC0gZnVuY3Rpb24obmMsIHZhcmlhYmxlKXsKICAgIGRhdCA8LSBuY3Zhcl9nZXQobmMsIHZhcmlhYmxlKQogICAgb3V0IDwtIGRhdAogICAgb3V0Cn0KCm1ha2VUaW1lc2VyaWVzRW5zZW1ibGUgPC0gZnVuY3Rpb24odmFyaWFibGUsIG5lbnMgPSA0OTksIG50cyA9IDE2NCwgY24gPSAxODUwOjIwMTMpewogIAogICMgbmVucyBpcyBudW1iZXIgb2YgZW5zZW1ibGUgbWVtYmVycwogICMgbnRzIGxlbmd0aCBvZiB0aW1lc2VyaWVzCiAgIyBjbiBpcyBjb2xuYW1lcygpCiAgZGF0bWF0IDwtIG1hdHJpeChOQSwgbnJvdyA9IG5lbnMsIG5jb2wgPSBudHMpCiAgY29sbmFtZXMoZGF0bWF0KSA8LSBjbgogIAogIGVuc2xpc3QgPC0gcGFzdGUoIlAiLCBmb3JtYXRDKDA6KG5lbnMtMSksIHdpZHRoPTQsIGZsYWc9IjAiKSwgc2VwPSIiKQogIGZsb2MgPC0gcGFzdGUwKGVuc2xvYyxlbnNtZW1iZXIsc3ViZGlyKQogIAogIGZvcihpIGluIDE6bmVucyl7CiAgICAKICAgIHZlYyA8LSByZXAoTkEsbnRzKQogICAgCiAgICBlbnNtZW1iZXIgPC0gZW5zbGlzdFtpXSAKICAgIAogICAgZm4gPC0gcGFzdGUwKGVuc2xvYyxlbnNtZW1iZXIsJy9zdGF0cy8nLCdKVUxFUy1FUy0xcDBfJyxlbnNtZW1iZXIsJ19Bbm51YWxfZ2xvYmFsLm5jJykKIAogICAgCiAgICB0cnkobmMgPC0gbmNfb3BlbihwYXN0ZTAoZm4pKSkKICAgIHRyeShkYXQgPC0gZXh0cmFjdFRpbWVzZXJpZXMobmMsIHZhcmlhYmxlKSkKICAgIAogICAgZGF0bWF0W2ksIF0gPC0gZGF0CiAgICBuY19jbG9zZShuYykKICB9CiAgZGF0bWF0Cn0KCmBgYAoKCiMjIFBsb3QgdGltZXNlcmllcyBvZiBhZ2dyZWdhdGVkIGdsb2JhbCB0aW1lc2VyaWVzIAoKYGBge3IgaW5jbHVkZT1GQUxTRSxtZXNzYWdlPUZBTFNFLCB3YXJuaW5nID0gRkFMU0V9CgojeW5hbWVzX2NvbnN0IDwtIGMoJ25icF9sbmRfc3VtJywgJ25wcF9ubGltX2xuZF9zdW0nLCAnY1NvaWxfbG5kX3N1bScsICdjVmVnX2xuZF9zdW0nKQojeXVuaXRzX2NvbnN0IDwtIGMoJ0d0Qy95ZWFyJywgJ0d0Qy95ZWFyJywgJ0d0QycsICdHdEMnKQojWV9jb25zdF9sZXZlbDEgPC0gWV9sZXZlbDFbLCB5bmFtZXNfY29uc3RdCgojIHByaW1hcnkgY2FyYm9uIGN5Y2xlIG91dHB1dHMKbnBwX2VucyA8LSBtYWtlVGltZXNlcmllc0Vuc2VtYmxlKHZhcmlhYmxlID0gIm5wcF9ubGltX2xuZF9zdW0iKSAvICgxZTEyL3lzZWMpCm5icF9lbnMgPC0gIG1ha2VUaW1lc2VyaWVzRW5zZW1ibGUodmFyaWFibGUgPSAibmJwX2xuZF9zdW0iKSAvICgxZTEyL3lzZWMpCmNTb2lsX2VucyA8LSAgbWFrZVRpbWVzZXJpZXNFbnNlbWJsZSh2YXJpYWJsZSA9ICJjU29pbF9sbmRfc3VtIikgLyAxZTEyCmNWZWdfZW5zIDwtICBtYWtlVGltZXNlcmllc0Vuc2VtYmxlKHZhcmlhYmxlID0gImNWZWdfbG5kX3N1bSIpIC8gMWUxMgoKdG90YWxfbGFuZF9jYXJib25fZW5zIDwtIGNTb2lsX2VucyArIGNWZWdfZW5zCgpsYWlfbG5kX21lYW5fZW5zIDwtIG1ha2VUaW1lc2VyaWVzRW5zZW1ibGUodmFyaWFibGUgPSAibGFpX2xuZF9tZWFuIikKCiMgZmx1eGVzCnJoX2xuZF9zdW1fZW5zIDwtIG1ha2VUaW1lc2VyaWVzRW5zZW1ibGUodmFyaWFibGUgPSAicmhfbG5kX3N1bSIpIC8gKDFlMTIveXNlYykKZkx1Y19sbmRfc3VtX2VucyA8LSBtYWtlVGltZXNlcmllc0Vuc2VtYmxlKHZhcmlhYmxlID0gImZMdWNfbG5kX3N1bSIpIC8gKDFlMTIveXNlYykKZkhhcnZlc3RfbG5kX3N1bV9lbnMgPC0gbWFrZVRpbWVzZXJpZXNFbnNlbWJsZSh2YXJpYWJsZSA9ICJmSGFydmVzdF9sbmRfc3VtIikgLyAoMWUxMi95c2VjKQoKCiMgZnJhY3Rpb25zCnRyZWVGcmFjX2xuZF9tZWFuX2VucyA8LSBtYWtlVGltZXNlcmllc0Vuc2VtYmxlKHZhcmlhYmxlID0gInRyZWVGcmFjX2xuZF9tZWFuIikKc2hydWJGcmFjX2xuZF9tZWFuX2VucyA8LSBtYWtlVGltZXNlcmllc0Vuc2VtYmxlKHZhcmlhYmxlID0gInNocnViRnJhY19sbmRfbWVhbiIpCmJhcmVzb2lsRnJhY19sbmRfbWVhbl9lbnMgPC0gbWFrZVRpbWVzZXJpZXNFbnNlbWJsZSh2YXJpYWJsZSA9ICJiYXJlc29pbEZyYWNfbG5kX21lYW4iKQojYzNQZnRGcmFjX2xuZF9tZWFuX2VucyA8LSBtYWtlVGltZXNlcmllc0Vuc2VtYmxlKHZhcmlhYmxlID0gImMzUGZ0RnJhY19sbmRfbWVhbl9lbnMiKQojYzRQZnRGcmFjX2xuZF9tZWFuX2VucyA8LSBtYWtlVGltZXNlcmllc0Vuc2VtYmxlKHZhcmlhYmxlID0gImM0UGZ0RnJhY19sbmRfbWVhbl9lbnMiKQoKCmBgYAoKCmBgYHtyIHBsb3QtY2FyYm9uLWN5Y2xlLXRpbWVzZXJpZXMtcHJpbWFyeSwgZmlnLndpZHRoID0gMTAsIGZpZy5oZWlnaHQgPSAxMn0KCnBhcihtZnJvdz0gYygzLDQpLCBsYXMgPSAxKQoKcGxvdGNvbCA8LSBjKG1ha2VUcmFuc3BhcmVudCgnYmxhY2snLCA3MCkpCgp5bGltID0gcmFuZ2UoYyhucHBfZW5zWywxXSwgbnBwX2Vuc1ssMTY0XSkpCm1hdHBsb3QoeWVhcnMsIHQobnBwX2VucyksIHR5cGUgPSAnbCcsIGx0eSA9ICdzb2xpZCcseWxpbSA9IHlsaW0sIGNvbCA9IHBsb3Rjb2wsCiAgICAgICAgeWxhYiA9ICdHdEMnLCBtYWluID0gJ05QUCcsIHhsYWIgPSAnJywKICAgICAgICBidHkgPSAnbicpCgp5bGltID0gcmFuZ2UoYyhjU29pbF9lbnNbLDFdLCBjU29pbF9lbnNbLDE2NF0pKQptYXRwbG90KHllYXJzLCB0KGNTb2lsX2VucyksIHR5cGUgPSAnbCcsIGx0eSA9ICdzb2xpZCcseWxpbSA9IHlsaW0sIGNvbCA9IHBsb3Rjb2wsCiAgICAgICAgeWxhYiA9ICdHdEMnLCBtYWluID0gJ1NvaWwgQ2FyYm9uJyx4bGFiID0gJycsCiAgICAgICAgYnR5ID0gJ24nKQoKeWxpbSA9IHJhbmdlKGMoY1ZlZ19lbnNbLDFdLCBjVmVnX2Vuc1ssMTY0XSkpCm1hdHBsb3QoeWVhcnMsIHQoY1ZlZ19lbnMpLCB0eXBlID0gJ2wnLCBsdHkgPSAnc29saWQnLHlsaW0gPSB5bGltLCBjb2wgPSBwbG90Y29sLAogICAgICAgIHlsYWIgPSAnR3RDJywgbWFpbiA9ICdWZWdldGF0aW9uIENhcmJvbicseGxhYiA9ICcnLAogICAgICAgIGJ0eSA9ICduJykKCnlsaW0gPSByYW5nZSh0b3RhbF9sYW5kX2NhcmJvbl9lbnMpCm1hdHBsb3QoeWVhcnMsIHQodG90YWxfbGFuZF9jYXJib25fZW5zKSwgdHlwZSA9ICdsJywgbHR5ID0gJ3NvbGlkJyx5bGltID0geWxpbSwgY29sID0gcGxvdGNvbCwgCiAgICAgICAgeWxhYiA9ICdHdEMnLCBtYWluID0gJ1RvdGFsIExhbmQgQ2FyYm9uJyx4bGFiID0gJycsCiAgICAgICAgYnR5ID0gJ24nKQoKCnlsaW0gPSByYW5nZShsYWlfbG5kX21lYW5fZW5zKQptYXRwbG90KHllYXJzLCB0KGxhaV9sbmRfbWVhbl9lbnMpLCB0eXBlID0gJ2wnLCBsdHkgPSAnc29saWQnLHlsaW0gPSB5bGltLCBjb2wgPSBwbG90Y29sLAogICAgICAgIHlsYWIgPSAnTEFJJywgbWFpbiA9ICdMZWFmIGFyZWEgaW5kZXgnLHhsYWIgPSAnJywKICAgICAgICBidHkgPSAnbicpCgp5bGltID0gcmFuZ2UodHJlZUZyYWNfbG5kX21lYW5fZW5zKQptYXRwbG90KHllYXJzLCB0KHRyZWVGcmFjX2xuZF9tZWFuX2VucyksIHR5cGUgPSAnbCcsIGx0eSA9ICdzb2xpZCcseWxpbSA9IHlsaW0sIGNvbCA9IHBsb3Rjb2wsCiAgICAgICAgeWxhYiA9ICdmcmFjdGlvbicsIG1haW4gPSAnVHJlZSBmcmFjdGlvbicseGxhYiA9ICcnLAogICAgICAgIGJ0eSA9ICduJykKCnlsaW0gPSByYW5nZShzaHJ1YkZyYWNfbG5kX21lYW5fZW5zKQptYXRwbG90KHllYXJzLCB0KHNocnViRnJhY19sbmRfbWVhbl9lbnMgKSwgdHlwZSA9ICdsJywgbHR5ID0gJ3NvbGlkJyx5bGltID0geWxpbSwgY29sID0gcGxvdGNvbCwKICAgICAgICB5bGFiID0gJ2ZyYWN0aW9uJywgbWFpbiA9ICdTaHJ1YiBmcmFjdGlvbicseGxhYiA9ICcnLAogICAgICAgIGJ0eSA9ICduJykKCnlsaW0gPSByYW5nZShiYXJlc29pbEZyYWNfbG5kX21lYW5fZW5zKQptYXRwbG90KHllYXJzLCB0KGJhcmVzb2lsRnJhY19sbmRfbWVhbl9lbnMgKSwgdHlwZSA9ICdsJywgbHR5ID0gJ3NvbGlkJyx5bGltID0geWxpbSwgY29sID0gcGxvdGNvbCwKICAgICAgICB5bGFiID0gJ2ZyYWN0aW9uJywgbWFpbiA9ICdiYXJlIHNvaWwgZnJhY3Rpb24nLHhsYWIgPSAnJywKICAgICAgICBidHkgPSAnbicpCgp5bGltID0gYygtMTAsIDEwKQptYXRwbG90KHllYXJzLCB0KG5icF9lbnMpLCB0eXBlID0gJ2wnLCBsdHkgPSAnc29saWQnLHlsaW0gPSB5bGltLCBjb2wgPSBwbG90Y29sLCAKICAgICAgICB5bGFiID0gJ0d0QycsIG1haW4gPSAnTkJQJywgeGxhYiA9ICcnLAogICAgICAgIGJ0eSA9ICduJykKICAKeWxpbSA9IHJhbmdlKHJoX2xuZF9zdW1fZW5zKQptYXRwbG90KHllYXJzLCB0KHJoX2xuZF9zdW1fZW5zKSwgdHlwZSA9ICdsJywgbHR5ID0gJ3NvbGlkJyx5bGltID0geWxpbSwgY29sID0gcGxvdGNvbCwKICAgICAgICB5bGFiID0gJ0d0Qy95ZWFyJywgbWFpbiA9ICdIZXRlcm90cm9waGljIFJlc3BpcmF0aW9uJywgeGxhYiA9ICcnLAogICAgICAgIGJ0eSA9ICduJykKCnlsaW0gPSByYW5nZShmTHVjX2xuZF9zdW1fZW5zKQptYXRwbG90KHllYXJzLCB0KGZMdWNfbG5kX3N1bV9lbnMpLCB0eXBlID0gJ2wnLCBsdHkgPSAnc29saWQnLHlsaW0gPSB5bGltLCBjb2wgPSBwbG90Y29sLAogICAgICAgIHlsYWIgPSAnR3RDL3llYXInLCBtYWluID0gJ0xhbmQgdXNlIGNoYW5nZSBlbWlzc2lvbnMnLCB4bGFiID0gJycsCiAgICAgICAgYnR5ID0gJ24nKQoKeWxpbSA9IHJhbmdlKGZIYXJ2ZXN0X2xuZF9zdW1fZW5zKQptYXRwbG90KHllYXJzLCB0KGZIYXJ2ZXN0X2xuZF9zdW1fZW5zKSwgdHlwZSA9ICdsJywgbHR5ID0gJ3NvbGlkJyx5bGltID0geWxpbSwgY29sID0gcGxvdGNvbCwKICAgICAgICB5bGFiID0gJ0d0Qy95ZWFyJywgbWFpbiA9ICdIYXJ2ZXN0IEMgZmx1eCB0byBhdG1vc3BoZXJlJywgeGxhYiA9ICcnLAogICAgICAgIGJ0eSA9ICduJykKCgoKCmBgYAoKCmBgYHtyIHBsb3QtY2FyYm9uLWN5Y2xlLWFub21hbHktdGltZXNlcmllcywgZmlnLndpZHRoID0gOSwgZmlnLmhlaWdodCA9IDZ9CgpucHBfZW5zX2Fub20gPC0gYW5vbWFsaXplVFNtYXRyaXgobnBwX2VucywgMToyMCkKbmJwX2Vuc19hbm9tIDwtIGFub21hbGl6ZVRTbWF0cml4KG5icF9lbnMsIDE6MjApCmNTb2lsX2Vuc19hbm9tIDwtIGFub21hbGl6ZVRTbWF0cml4KGNTb2lsX2VucywgMToyMCkKY1ZlZ19lbnNfYW5vbSA8LSBhbm9tYWxpemVUU21hdHJpeChjVmVnX2VucywgMToyMCkKdG90YWxfbGFuZF9jYXJib25fYW5vbSA8LSBhbm9tYWxpemVUU21hdHJpeCh0b3RhbF9sYW5kX2NhcmJvbl9lbnMsIDE6MjApCgpwYXIobWZyb3c9IGMoMSw0KSwgbGFzID0gMSkKCiMgeWxpbSA9IHJhbmdlKC0xMCwgMTApCiNtYXRwbG90KHllYXJzLCB0KG5icF9lbnNfYW5vbSksIHR5cGUgPSAnbCcsIGx0eSA9ICdzb2xpZCcseWxpbSA9IHlsaW0sIGNvbCA9IHBsb3Rjb2wsCiMgICAgICAgIHlsYWIgPSAnTkJQIHN1bSBBbm9tYWx5JywgbWFpbiA9ICdOQlAgQW5vbWFseScsCiMgICAgICAgIGJ0eSA9ICduJykKCnlsaW0gPSByYW5nZShjKG5wcF9lbnNfYW5vbVssMV0sIG5wcF9lbnNfYW5vbVssMTY0XSkpCm1hdHBsb3QoeWVhcnMsIHQobnBwX2Vuc19hbm9tKSwgdHlwZSA9ICdsJywgbHR5ID0gJ3NvbGlkJyx5bGltID0geWxpbSwgY29sID0gcGxvdGNvbCwKICAgICAgICB5bGFiID0gJ05QUCBzdW0gQW5vbWFseScsIG1haW4gPSAnTlBQIEFub21hbHknLAogICAgICAgIGJ0eSA9ICduJykKCnlsaW0gPSByYW5nZShjKGNTb2lsX2Vuc19hbm9tWywxXSwgY1NvaWxfZW5zX2Fub21bLDE2NF0pKQptYXRwbG90KHllYXJzLCB0KGNTb2lsX2Vuc19hbm9tKSwgdHlwZSA9ICdsJywgbHR5ID0gJ3NvbGlkJyx5bGltID0geWxpbSwgY29sID0gcGxvdGNvbCwKICAgICAgICB5bGFiID0gJ0d0QycsIG1haW4gPSAnU29pbCBDYXJib24gQW5vbWFseScsCiAgICAgICAgYnR5ID0gJ24nKQoKeWxpbSA9IHJhbmdlKGMoY1ZlZ19lbnNfYW5vbVssMV0sIGNWZWdfZW5zX2Fub21bLDE2NF0pKQptYXRwbG90KHllYXJzLCB0KGNWZWdfZW5zX2Fub20pLCB0eXBlID0gJ2wnLCBsdHkgPSAnc29saWQnLHlsaW0gPSB5bGltLCBjb2wgPSBwbG90Y29sLAogICAgICAgIHlsYWIgPSAnR3RDJywgbWFpbiA9ICdWZWdldGF0aW9uIENhcmJvbiBBbm9tYWx5JywKICAgICAgICBidHkgPSAnbicpCgp5bGltID0gcmFuZ2UodG90YWxfbGFuZF9jYXJib25fYW5vbSkKbWF0cGxvdCh5ZWFycywgdCh0b3RhbF9sYW5kX2NhcmJvbl9hbm9tKSwgdHlwZSA9ICdsJywgbHR5ID0gJ3NvbGlkJyx5bGltID0geWxpbSwgY29sID0gcGxvdGNvbCwKICAgICAgICB5bGFiID0gJ0d0QycsIG1haW4gPSAnVG90YWwgTGFuZCBDYXJib24gQW5vbWFseScsCiAgICAgICAgYnR5ID0gJ24nKQoKCmBgYAoKIyMgQ2FuIHdlIHVuZGVyc3RhbmQgY2hhbmdlIGFuZCBhYnNvbHV0ZT8KYGBge3J9CgoKCgoKYGBgCgoKCiMjIEZ1bmN0aW9uIHRvIGV4dHJhY3QgdGhlICJtb2Rlcm4gdmFsdWUiIGRpcmVjdCBmcm9tIHRoZSBmaWxlIChsYXN0IDIwIHllYXJzIG9mIHRoZSB0aW1lc2VyaWVzKQpgYGB7ciBleHRyYWN0LW1vZGVybi12YWx1ZS1mdW5jdGlvbiwgcmVzdWx0cyA9ICdoaWRlJ30KIyBmb3IgZWFjaCBvZiB0aGUgdmFyaWFibGVzIGluIHRoZSBmaWxlLCBhdmVyYWdlIHRoZSBsYXN0IDIwIHllYXJzIGFzIHRoZSAibW9kZXJuIiB2YWx1ZSwKIyBhbmQgdGhlbiBwbGFjZSBpbiBhIG1hdHJpeAoKbW9kZXJuVmFsdWUgPC0gZnVuY3Rpb24obmMsIHZhcmlhYmxlLCBpeCl7CiAgIyBBIGJhc2ljIGZ1bmN0aW9uIHRvIHJlYWQgYSB2YXJpYWJsZSBhbmQgCiAgIyB0YWtlIHRoZSBtZWFuIG9mIHRoZSB0aW1lc2VyaWVzIGF0IGxvY2F0aW9ucyBpeAogIGRhdCA8LSBuY3Zhcl9nZXQobmMsIHZhcmlhYmxlKQogIG91dCA8LSBtZWFuKGRhdFtpeF0pCiAgb3V0Cn0KIzE0NDoxNjQgaXMgdGhlIDE5OTM6MjAxMwptb2Rlcm5WYWx1ZShuYyA9IG5jLCB2YXJpYWJsZSA9ICJucHBfbmxpbV9sbmRfbWVhbiIsIGl4ID0gMTQ0OjE2NCkKCiMgYXBwbHkgdG8gdGhlIHRlc3QgZmlsZSB0byBjaGVjayBpdCB3b3Jrcwp2ZWMgPC0gc2FwcGx5KHZhcmxpc3QsIEZVTiA9IG1vZGVyblZhbHVlLCBuYyA9IG5jLCBpeCA9IDE0NDoxNjQpCgpgYGAKCiMjIExvb3AgdG8gZXh0cmFjdCB0aGUgIm1vZGVybiB2YWx1ZSIgb2YgYSBudW1iZXIgb2YgbW9kZWwgb3V0cHV0cwoKYGBge3IgbG9hZC1lbnNlbWJsZSwgd2FybmluZyA9IEZBTFNFLCBtZXNzYWdlID0gRkFMU0UsIHJlc3VsdHMgPSBGQUxTRX0KIyBHZW5lcmF0ZSBlbnNlbWJsZSBudW1iZXJzLCBtZWFuIG9mIHRoZSBsYXN0IDIwIHllYXJzIG9mIHRoZSB0aW1lc2VyaWVzICgxOTk0LTIwMTMpCgppZiAoZmlsZS5leGlzdHMoImVuc2VtYmxlLnJkYXRhIikpIHsKICBsb2FkKCJlbnNlbWJsZS5yZGF0YSIpCn0gZWxzZSB7CiAgCiAgbmVucyA9IDQ5OQogIGRhdG1hdCA8LSBtYXRyaXgobnJvdyA9IG5lbnMsIG5jb2wgPSBsZW5ndGgodmFybGlzdCkpCiAgY29sbmFtZXMoZGF0bWF0KSA8LSB2YXJsaXN0CiAgCiAgZW5zbGlzdCA8LSBwYXN0ZSgiUCIsIGZvcm1hdEMoMDoobmVucy0xKSwgd2lkdGg9NCwgZmxhZz0iMCIpLCBzZXA9IiIpCiAgZmxvYyA8LSBwYXN0ZTAoZW5zbG9jLGVuc21lbWJlcixzdWJkaXIpCiAgCiAgZm9yKGkgaW4gMTpuZW5zKXsKICAgIAogICAgdmVjIDwtIHJlcChOQSwgbGVuZ3RoKHZhcmxpc3QpKQogICAgCiAgICBlbnNtZW1iZXIgPC0gZW5zbGlzdFtpXSAKICAgIAogICAgZm4gPC0gcGFzdGUwKGVuc2xvYyxlbnNtZW1iZXIsJy9zdGF0cy8nLCdKVUxFUy1FUy0xcDBfJyxlbnNtZW1iZXIsJ19Bbm51YWxfZ2xvYmFsLm5jJykKICAgICNwcmludChmbikKICAgIAogICAgdHJ5KG5jIDwtIG5jX29wZW4ocGFzdGUwKGZuKSkpCiAgICB0cnkodmVjIDwtIHNhcHBseSh2YXJsaXN0LCBGVU4gPSBtb2Rlcm5WYWx1ZSwgbmMgPSBuYywgaXggPSAxNDQ6MTY0KSkKICAgIGRhdG1hdFtpLCBdIDwtIHZlYwogICAgbmNfY2xvc2UobmMpCiAgfQogIAogIHNhdmUobmVucywgZGF0bWF0LGVuc2xpc3QsZmxvYywgZmlsZSA9ImVuc2VtYmxlLnJkYXRhIikKfQpgYGAKCgojIyBDYWxjdWxhdGUgYW4gZW5zZW1ibGUgb2YgYW5vbWFsaWVzIGZvciBhbGwgdmFyaWFibGVzCkZvciBlYWNoIGVuc2VtYmxlIG1lbWJlciBhbmQgZWFjaCB2YXJpYWJsZSwgY2FsY3VsYXRlIHRoZSBjaGFuZ2UgZnJvbSB0aGUgMjAgeWVhcnMgYXQgdGhlIHN0YXJ0IG9mIHRoZSBydW4sIHRvIHRoZSB0d2VudHkgeWVhcnMgYXQgdGhlIGVuZCBvZiB0aGUgcnVuLgoKYGBge3J9CnRzQW5vbWFseSA8LSBmdW5jdGlvbihuYywgdmFyaWFibGUsIHN0YXJ0aXggPSAxOjIwLCBlbmRpeCA9IDE0NDoxNjQpewoKICAjIEEgYmFzaWMgZnVuY3Rpb24gdG8gcmVhZCBhIHZhcmlhYmxlIGFuZCBjYWxjdWxhdGUgdGhlIGFub21hbHkgYXQgdGhlIGVuZCBvZiB0aGUgcnVuCiAgZGF0IDwtIG5jdmFyX2dldChuYywgdmFyaWFibGUpCiAgZW5kTWVhbiA8LSBtZWFuKGRhdFtlbmRpeF0pCiAgc3RhcnRNZWFuIDwtIG1lYW4oZGF0W3N0YXJ0aXhdKQogIG91dCA8LSBlbmRNZWFuIC0gc3RhcnRNZWFuCiAgb3V0Cn0KCnRzQW5vbWFseShuYyA9IG5jLCB2YXJpYWJsZSA9ICJucHBfbmxpbV9sbmRfbWVhbiIpCmBgYAoKYGBge3IgbG9hZC1hbm9tYWx5LWVuc2VtYmxlLCB3YXJuaW5nID0gRkFMU0UsIG1lc3NhZ2UgPSBGQUxTRSwgcmVzdWx0cyA9IEZBTFNFfQojIEdlbmVyYXRlIGVuc2VtYmxlICBtZWFuIG9mIHRoZSBsYXN0IDIwIHllYXJzIG9mIHRoZSB0aW1lc2VyaWVzICgxOTk0LTIwMTMpCgppZiAoZmlsZS5leGlzdHMoImFub21hbHlfZW5zZW1ibGUucmRhdGEiKSkgewogIGxvYWQoImFub21hbHlfZW5zZW1ibGUucmRhdGEiKQp9IGVsc2UgewogIAogIG5lbnMgPSA0OTkKICBkYXRtYXRBbm9tIDwtIG1hdHJpeChucm93ID0gbmVucywgbmNvbCA9IGxlbmd0aCh2YXJsaXN0KSkKICBjb2xuYW1lcyhkYXRtYXRBbm9tKSA8LSB2YXJsaXN0CiAgCiAgZW5zbGlzdCA8LSBwYXN0ZSgiUCIsIGZvcm1hdEMoMDoobmVucy0xKSwgd2lkdGg9NCwgZmxhZz0iMCIpLCBzZXA9IiIpCiAgZmxvYyA8LSBwYXN0ZTAoZW5zbG9jLGVuc21lbWJlcixzdWJkaXIpCiAgCiAgZm9yKGkgaW4gMTpuZW5zKXsKICAgIAogICAgdmVjIDwtIHJlcChOQSwgbGVuZ3RoKHZhcmxpc3QpKQogICAgCiAgICBlbnNtZW1iZXIgPC0gZW5zbGlzdFtpXSAKICAgIAogICAgZm4gPC0gcGFzdGUwKGVuc2xvYyxlbnNtZW1iZXIsJy9zdGF0cy8nLCdKVUxFUy1FUy0xcDBfJyxlbnNtZW1iZXIsJ19Bbm51YWxfZ2xvYmFsLm5jJykKICAgICNwcmludChmbikKICAgIAogICAgdHJ5KG5jIDwtIG5jX29wZW4ocGFzdGUwKGZuKSkpCiAgICB0cnkodmVjIDwtIHNhcHBseSh2YXJsaXN0LCBGVU4gPSB0c0Fub21hbHksIG5jID0gbmMpKQogICAgZGF0bWF0QW5vbVtpLCBdIDwtIHZlYwogICAgbmNfY2xvc2UobmMpCiAgfQogIAogIHNhdmUobmVucywgZGF0bWF0QW5vbSwgZW5zbGlzdCxmbG9jLCBmaWxlID0iYW5vbWFseV9lbnNlbWJsZS5yZGF0YSIpCn0KYGBgCgoKIyMgQ2xlYW4gZGF0YSBzZXRzIHRvICJsZXZlbCAwIgpJbml0aWFsIGNsZWFuIG9mIGRhdGEgc2V0LCByZW1vdmluZyB2YXJpYWJsZXMgdGhhdCBkb24ndCBjaGFuZ2UsIGFuZCByZW1vdmluZyBOQXMgKG1vZGVscyB0aGF0IGRpZG4ndCBydW4pLgpgYGB7ciBsZXZlbC0wLW91dHB1dH0KCllfbmxldmVsMF9peCA8LSB3aGljaChpcy5uYShkYXRtYXRbLCd5ZWFyJ10pKQoKWUFub21fbmxldmVsMF9peCA8LSB3aGljaChpcy5uYShkYXRtYXRBbm9tWywneWVhciddKSkKCiMgVGhpcyBzaG91bGQgYmUgdHJ1ZSB0byBwcm9jZWVkLCBvciB3ZSdsbCBoYXZlIHRvIHN0YXJ0IGV4Y2x1ZGluZyB0aGUgY29tYmluZWQgc2V0LgppZGVudGljYWwoWV9ubGV2ZWwwX2l4LCBZQW5vbV9ubGV2ZWwwX2l4KQoKIyBZIGlzIHRoZSB3aG9sZSBkYXRhIHNldApZIDwtIGRhdG1hdAojIFlfbGV2ZWwwIGlzIHRoZSAnY2xlYW5lZCcgZGF0YSBzZXQsIHRydW5jYXRlZCB0byB2YXJpYWJsZXMgdGhhdCBjaGFuZ2UsIGFuZCByZW1vdmluZyBOQXMKWV9sZXZlbDAgPC0gZGF0bWF0Wy1ZX25sZXZlbDBfaXgsIC1jKDIsMzAsMzEpXQpZX25sZXZlbDAgPC0gZGF0bWF0W1lfbmxldmVsMF9peCwgLWMoMiwgMzAsIDMxKV0KCgojIFkgaXMgdGhlIHdob2xlIGRhdGEgc2V0CllBbm9tIDwtIGRhdG1hdEFub20KIyBZLmxldmVsMCBpcyB0aGUgJ2NsZWFuZWQnIGRhdGEgc2V0LCB0cnVuY2F0ZWQgdG8gdmFyaWFibGVzIHRoYXQgY2hhbmdlLCBhbmQgcmVtb3ZpbmcgTkFzCllBbm9tX2xldmVsMCA8LSBkYXRtYXRBbm9tWy1ZQW5vbV9ubGV2ZWwwX2l4LCAtYygyLDMwLDMxKV0KWUFub21fbmxldmVsMCA8LSBkYXRtYXRBbm9tW1lBbm9tX25sZXZlbDBfaXgsIC1jKDIsMzAsMzEpXQoKYGBgCgpgYGB7ciBsZXZlbC0wLWlucHV0fQojIGxvYWQgdGhlIG9yaWdpbmFsIGRlc2lnbiBhbmQgaW5wdXQgc3BhY2UsIG5vcm1hbGl6ZSB0byBbMC0xXQoKIyBMb2FkIHVwIHRoZSBkYXRhCmxoc19pID0gcmVhZC50YWJsZSgnfi9icmF6aWxDU1NQL2NvZGUvYnJhemlsX2Nzc3AvYW5hbHl6ZV91LWFvNzMyL2RhdGEvRVNfUFBFX2kvbGhzX3UtYW83MzIudHh0JywgaGVhZGVyID0gVFJVRSkKbGhzX2lpID0gcmVhZC50YWJsZSgnfi9icmF6aWxDU1NQL2NvZGUvYnJhemlsX2Nzc3AvYW5hbHl6ZV91LWFvNzMyL2RhdGEvRVNfUFBFX2lpL2xoc191LWFvNzMyYS50eHQnLCBoZWFkZXIgPSBUUlVFKQoKdG9wbGV2ZWxfaXggPSAxOjQ5OQoKIyBUaGUgcmF3IGlucHV0IGRhdGEgaXMgYSBsYXRpbiBoeXBlcmN1YmUKbGhzID0gcmJpbmQobGhzX2ksIGxoc19paSlbdG9wbGV2ZWxfaXgsIF0KbGhzX2xldmVsMCA8LSBsaHNbLVlfbmxldmVsMF9peCxdCgpYID0gbm9ybWFsaXplKGxocykKY29sbmFtZXMoWCkgPSBjb2xuYW1lcyhsaHMpCgpYX2xldmVsMCA8LSBYWy1ZX25sZXZlbDBfaXgsXQpYX25sZXZlbDAgPC0gWFtZX25sZXZlbDBfaXgsXQoKZCA9IG5jb2woWCkKIyBsb3dlciBhbmQgaGlnaGVyIGJvdW5kIG9uIHRoZSBub3JtYWxpc2VkIG1hdHJpeCBmb3IgdmlzdWFsaXNhdGlvbgpyeCA9IHJiaW5kKHJlcCgwLDMyKSwgcmVwKDEsMzIpKQpgYGAKCgojIyBXaGVyZSBkaWQgdGhlIG1vZGVsIGZhaWwgdG8gcnVuPwooInByb2JhYmlsaXR5IG9mIHJ1biBmYWlsdXJlIiBDb3VsZCBiZSBhbiBpbnRlcmVzdGluZyBwcm9qZWN0IC0gbG9naXQgdHJhbnNmb3JtYXRpb24gZm9yIHByb2JhYmlsaXR5IG9mIHJ1biBmYWlsdXJlPyBTb21lIG90aGVyIE1MIGxpa2UgU1ZNPwoKVGhlcmUgYXJlIGNsZWFyIHJ1biBmYWlsdXJlIHRocmVzaG9sZHMgaW4gdGhlIHBhcmFtZXRlcnMgcm9vdGRfZnRfaW8gYW5kIGxhaV9tYXgsIGFuZCBxdWl0ZSBzdHJvbmcgdmlzdWFsIGluZGljYXRpb25zIHRoYXQgYV93bF9pbyBhbmQgYmlvX2h1bV9jbiBtYXR0ZXIuCgoKTkVYVCwgaGlzdG9ncmFtcyBvZiBmYWlsdXJlIHdpdGggdGhlIExIUyB2YWx1ZQpgYGB7ciBydW4tZmFpbHVyZS1wYWlycywgZmlnLndpZHRoID0gMTIsIGZpZy5oZWlnaHQgPSAxMn0KCiMgTkIsIHBsb3R0aW5nIHRoZSBpbnZlcnNlIG9mIHRoaXMgZG9lc24ndCBnaXZlIHlvdSBtdWNoIGluZm9ybWF0aW9uCgojc2ltcGxlIHdheQpwYXIob21hID0gYygxMCwxMCwwLDApKQojcGFyKHhwZCA9IFRSVUUpCnBhaXJzKFhfbmxldmVsMCwgCiAgICAgIHhsaW0gPSBjKDAsMSksIHlsaW0gPSBjKDAsMSksCiAgICAgIGxhYmVscyA9IDE6ZCwKICAgICAgY29sID0gbWFrZVRyYW5zcGFyZW50KCdyZWQnLCAxNTApLAogICAgICBnYXAgPSAwLAogICAgICBwY2ggPSAyMCwKICAgICAgeGF4dCA9J24nLCB5YXh0ID0gJ24nLAogICAgICBsb3dlci5wYW5lbCA9IE5VTEwpCgpyZXNldCgpCgpsZWdlbmQoJ2xlZnQnLCBsZWdlbmQgPSBwYXN0ZSgxOmQsIGNvbG5hbWVzKGxocykpLCBjZXggPSAxLjIsIGJ0eSA9ICduJykKCmBgYAoKCmBgYHtyLCBmaWcud2lkdGggPSAxMiwgZmlnLmhlaWdodCA9IDh9CgpwYXIobWZyb3cgPSBjKDQsIDgpLCBtYXIgPSBjKDQsMywyLDEpKQoKZm9yKGkgaW4gMTpkKXsKICAKICBoaXN0KFhfbmxldmVsMFssaV0sIHhsaW0gPSBjKDAsMSksIGJyZWFrcyA9IHNlcShmcm9tPTAsIHRvID0gMSwgYnkgPSAwLjEpLCBjb2wgPSAnZ3JleScsIG1haW4gPSAnJywgeWxpbSA9IGMoMCw5KSwKICAgICAgIGJvcmRlciA9ICd3aGl0ZScsIHhsYWIgPSBjb2xuYW1lcyhYX25sZXZlbDApW2ldLCB5bGFiID0gJycsIGxhcyA9IDEsIGNleC5sYWIgPSAxLjUpCn0KCmBgYAoKCiMjIFRlc3RpbmcgR2F1c3NpYW4gUHJvY2VzcyBlbXVsYXRvcnMKCgojIyMgTlBQIGFzIGEgdGVzdApGaXJzdCwgdXNlIG1lYW4gTlBQIGFzIGFuIGV4YW1wbGUuIEhvdyBkb2VzIE5QUCByZXNwb25kIHRvIGVhY2ggcGFyYW1ldGVyPyBOQXMgYXJlIHJlbW92ZWQsIGJ1dCB6ZXJvIHZhbHVlcyBhcmUgc3RpbGwgaW5jbHVkZWQuCgpgYGB7ciBwbG90LW5wcC1tb2Rlcm4sIGZpZy53aWR0aCA9IDEyLCBmaWcuaGVpZ2h0ID0gMTJ9CnAgPC0gbmNvbChYX2xldmVsMCkKCnlfbGV2ZWwwIDwtIFlfbGV2ZWwwWywnbnBwX25saW1fbG5kX3N1bSddCgpwYXIobWZyb3cgPSBjKDUsNyksIG1hciA9IGMoMywxLDMsMSksIG9tYSA9IGMoMSwxLDUsMSkpCmZvcihpIGluIDE6cCl7CiAgcGxvdChYX2xldmVsMFssaV0sIHlfbGV2ZWwwLCB4bGFiID0gJycsIHlsYWIgPSAnJywgbWFpbiA9IGNvbG5hbWVzKFhfbGV2ZWwwKVtpXSkKfQptdGV4dCgnTlBQJywgb3V0ZXIgPSBUUlVFLCBzaWRlID0gMywgY2V4ID0gMiwgbGluZSA9IDIpCgpgYGAKCgpgYGB7ciBwbG90LW5wcC1jaGFuZ2UsIGZpZy53aWR0aCA9IDEyLCBmaWcuaGVpZ2h0ID0gMTJ9Cgp5YW5vbV9sZXZlbDAgPC0gWUFub21fbGV2ZWwwWywnbnBwX25saW1fbG5kX3N1bSddCgpwYXIobWZyb3cgPSBjKDUsNyksIG1hciA9IGMoMywxLDMsMSksIG9tYSA9IGMoMSwxLDUsMSkpCmZvcihpIGluIDE6cCl7CiAgcGxvdChYX2xldmVsMFssaV0sIHlhbm9tX2xldmVsMCwgeGxhYiA9ICcnLCB5bGFiID0gJycsIG1haW4gPSBjb2xuYW1lcyhYX2xldmVsMClbaV0pCn0KbXRleHQoJ05QUCBjaGFuZ2Ugb3ZlciB0aW1lJywgb3V0ZXIgPSBUUlVFLCBzaWRlID0gMywgY2V4ID0gMiwgbGluZSA9IDIpCgpgYGAKCgojIyBSZWxhdGlvbnNoaXAgYmV0d2VlbiBtb2Rlcm4gTlBQIGFuZCBjaGFuZ2Ugc2luY2UgMTg1MC4KClNvbWUgb3V0cHV0cyAoZS5nIGZMdWMsIGZIYXJ2ZXN0KSBoYXZlIGFuIGFsbW9zdCBwZXJmZWN0IDE6MSByZWxhdGlvbnNoaXAgYmV0d2VlbiBtb2Rlcm4gdmFsdWUgYW5kIGNoYW5nZSwgc29tZSAgKG5icCwgbnBwLCB0cmVlRnJhYykgcXVpdGUgb3IgbW9kZXJhdGVseSBzdHJvbmcsIGFuZCBzb21lIChjc29pbCwgY3ZlZykgdmVyeSB3ZWFrIG9yIG5vbi1leGlzdGFudC4KYGBge3IgbnBwLW1vZGVybi12cy1jaGFuZ2UsIGZpZy53aWR0aCA9IDEyLCBmaWcuaGVpZ2h0ID0gOH0KCnBhcihtZnJvdyA9IGMoNCw3KSwgbWFyID0gYygzLDEsMywxKSwgb21hID0gYyg0LDUsMSwxKSkKCnBkYXNoIDwtIG5jb2woWV9sZXZlbDApCgpmb3IoaSBpbiAxOnBkYXNoKXsKICAKICB5X2xldmVsMCA8LSBZX2xldmVsMFssaV0KICB5YW5vbV9sZXZlbDAgPC0gWUFub21fbGV2ZWwwWyxpXQogIAogIHBsb3QoeV9sZXZlbDAsIHlhbm9tX2xldmVsMCwgeGxhYiA9ICcnLCB5bGFiID0gJycsIG1haW4gPSBjb2xuYW1lcyhZX2xldmVsMClbaV0pCn0KCm10ZXh0KHRleHQgPSAnTW9kZXJuIHZhbHVlJywgc2lkZSA9IDEsIGxpbmUgPSAyLCBvdXRlciA9IFRSVUUsIGNleCA9IDIpCm10ZXh0KHRleHQgPSAnQ2hhbmdlJywgc2lkZSA9IDIsIGxpbmUgPSAyLCBvdXRlciA9IFRSVUUsIGNleCA9IDIpCgpgYGAKCgoKIyMgQSBjbGVhciB0aHJlc2hvbGQgaW4gdGhlIEYwIHBhcmFtZXRlciBmb3IgTlBQCkl0IGFwcGVhcnMgdGhhdCB0aGlzIGVuc2VtYmxlIGlzIGxlc3MgImNsZWFyIGN1dCIgaW4gaGF2aW5nIGFuIG91dHB1dCB0aGF0IGNsZWFybHkgZGlzdGluZ3Vpc2hlcyBiZXR3ZWVuICJmYWlsZWQiIChvciBjbG9zZSB0byBpdCksIGFuZCAibm90IGZhaWxlZCIuCgpIYXZpbmcgc2FpZCB0aGF0LCBoYXZpbmcgYW4gRjAgb3ZlciBhIHRocmVzaG9sZCBzZWVtcyB0byBraWxsIHRoZSBjYXJib24gY3ljbGUsIGFzIGJlZm9yZS4gSGVyZSwgd2UndmUgc2V0IGEgdGhyZXNob2xkIG9mIDAuOSAob24gdGhlIG5vcm1hbGlzZWQgc2NhbGUpIGZvciBGMCwgYW5kIHdlIHJlbW92ZSBtZW1iZXJzIG9mIHRoZSBlbnNlbWJsZSB3aXRoIGEgbGFyZ2VyIEYwIHRoYW4gdGhhdCB3aGVuIHdlIGJ1aWxkIGVtdWxhdG9ycy4KCmBgYHtyLCBmaWcud2lkdGggPSA2LCBmaWcuaGVpZ2h0ID0gOH0KCnBhcihtZnJvdyA9IGMoMiwxKSkKcGxvdChsaHMkZjBfaW8sIGRhdG1hdFssICducHBfbmxpbV9sbmRfc3VtJ10sIG1haW4gPSAnTXVsdGlwbGljYXRpb24gZmFjdG9yJywgeGxhYiA9ICdmMF9pbycsIHlsYWIgPSAnTlBQIHN1bScpCnBsb3QoWF9sZXZlbDBbLCdmMF9pbyddLCBZX2xldmVsMFssICducHBfbmxpbV9sbmRfc3VtJ10sIHhsYWIgPSAnZjBfaW8nLCBtYWluID0gJ05vcm1hbGl6ZWQnLCB5bGFiID0gJ05QUCBzdW0nKQphYmxpbmUodiA9IDAuOSkKCmBgYAoKCiMjIExldmVsIDEgY29uc3RyYWludCAtIHJlbW92ZSBlbnNlbWJsZSBtZW1iZXJzIHdpdGggRjAgYWJvdmUgdGhyZXNob2xkClRoZSBsZXZlbCAxIGNvbnN0cmFpbnQgcmVtb3ZlcyBhbnkgaW5wdXQgd2l0aCBGMCBncmVhdGVyIHRoYW4gMC45IChub3JtYWxpc2VkKSwgd2hpY2ggcmVtb3ZlcyBtYW55IG9mIHRoZSB6ZXJvLWNhcmJvbi1jeWNsZSBtZW1iZXJzIHVwIGZyb250LiBUaGVyZSBhcmUgNDI0IGVuc21ibGUgbWVtYmVycyByZW1haW5pbmcuCgpUaGlzIGRvZXMgY29uc3RyYWludCBzZXF1ZW50aWFsbHksIHdoaWNoIG1heSBub3QgYmUgYSBnb29kIGlkZWEuIApgYGB7cn0KbGV2ZWwxX2l4IDwtIHdoaWNoKFhfbGV2ZWwwWywgJ2YwX2lvJ10gPCAwLjkpCgpYX2xldmVsMSA8LSBYX2xldmVsMFtsZXZlbDFfaXgsIF0KWV9sZXZlbDEgPC0gWV9sZXZlbDBbbGV2ZWwxX2l4LCBdCgpZQW5vbV9sZXZlbDEgPC0gWUFub21fbGV2ZWwwW2xldmVsMV9peCwgXQoKeV9sZXZlbDEgPC0gWV9sZXZlbDFbLCAnbnBwX25saW1fbG5kX3N1bSddCmBgYAoKIyMjIENvbXBhcmlzb24gb2YgbGV2ZWwgMCBhbmQgbGV2ZWwgMSBlbXVsYXRvcnMgZm9yIE5QUCAobW9kZXJuIHZhbHVlKQoKYGBge3IsIGZpZy53aWR0aCA9IDcsIGZpZy5oZWlnaHQgPSA3LCByZXN1bHRzID0gJ2hpZGUnLCB3YXJuaW5nPUZBTFNFfQplbV9ucHBfbGV2ZWwwIDwtIGttKH4uLCBkZXNpZ24gPSBYX2xldmVsMCwgIHJlc3BvbnNlID0geV9sZXZlbDApCmVtX25wcF9sZXZlbDEgPC0ga20ofi4sIGRlc2lnbiA9IFhfbGV2ZWwxLCAgcmVzcG9uc2UgPSB5X2xldmVsMSkKCmVtX25wcF9sZXZlbDBfbXMgPC0ga20ofi4sIGRlc2lnbiA9IFhfbGV2ZWwwLCAgcmVzcG9uc2UgPSB5X2xldmVsMCwgbXVsdGlzdGFydCA9IDQpCmVtX25wcF9sZXZlbDFfbXMgPC0ga20ofi4sIGRlc2lnbiA9IFhfbGV2ZWwxLCAgcmVzcG9uc2UgPSB5X2xldmVsMSwgbXVsdGlzdGFydCA9IDQpCgoKYGBgCgoKICMgUGxvdCB0aGUgcmVndWxhciBrbSBlbXVsYXRvci4gRG9lc24ndCBsb29rIGdyZWF0LgoKYGBge3IgcGxvdC1lbS1ucHAtbGV2ZWwwLCBmaWcud2lkdGggPSA3LCBmaWcuaGVpZ2h0ID0gN30KcGxvdChlbV9ucHBfbGV2ZWwwKQpgYGAKCmBgYHtyIHBsb3QtZW0tbnBwLWxldmVsMSwgZmlnLndpZHRoID0gNywgZmlnLmhlaWdodCA9IDd9CnBsb3QoZW1fbnBwX2xldmVsMSkKYGBgCgoKIyMjIExlYXZlLW9uZS1vdXQgc3VtbWFyaWVzIG9mIE5QUCBlbXVsYXRvcnMKYGBge3J9Cgpsb29fbnBwX2xldmVsMCA8LSBsZWF2ZU9uZU91dC5rbShlbV9ucHBfbGV2ZWwwLCB0eXBlID0gJ1VLJywgdHJlbmQucmVlc3RpbSA9IFRSVUUpCmxvb19ucHBfbGV2ZWwxIDwtIGxlYXZlT25lT3V0LmttKGVtX25wcF9sZXZlbDEsIHR5cGUgPSAnVUsnLCB0cmVuZC5yZWVzdGltID0gVFJVRSkKClJNU0UgKCBsb29fbnBwX2xldmVsMCRtZWFuLCB5X2xldmVsMCkKUk1TRSAoIGxvb19ucHBfbGV2ZWwxJG1lYW4sIHlfbGV2ZWwxKQoKCiMgSG93IGFib3V0IE1BRSBvdmVyIHRoZSByYW5nZQpwcm9wX21hZSA8LSBmdW5jdGlvbihZLCBZcHJlZCl7CiAgIyBtZWFuIGFic29sdXRlIGVycm9yIGFzIGEgcHJvcG9ydGlvbiBvZiB0aGUgcmFuZ2Ugb2Ygb3V0cHV0CiAgCiAgYWJzZGlmZiA8LSBhYnMoZGlmZihyYW5nZShZKSkpCiAgCiAgbWFlIDwtIE1BRShZLCBZcHJlZCkKICAKICBwcm9wbWFlIDwtIChtYWUgLyBhYnNkaWZmKSAqIDEwMAogIAogIHByb3BtYWUKICAKfQoKcHJvcF9tYWUoeV9sZXZlbDAsIGxvb19ucHBfbGV2ZWwwJG1lYW4pCgpwcm9wX21hZSh5X2xldmVsMSwgbG9vX25wcF9sZXZlbDEkbWVhbikKCgoKCgoKYGBgCgoKYGBge3J9CgoKCgpgYGAKCmBgYHtyfQoKIyBNT1ZFIFRISVMgVE8gSU1QVE9PTFMgT1IgRU1UT09MUwojIEdpdmVuIGEga20gbW9kZWwsIHByb2R1Y2Ugc29tZSBlcnJvciBzdGF0aXN0aWNzCgoKYGBgCgpgYGB7cn0KCiMgSXQgZG9lc24ndCBsb29rIGxpa2UgTXVsdGlzdGFydCBtYWtlcyBhIGJpZyBkaWZmZXJlbmNlIGF0IGFsbCBmb3IgTlBQCmVycnN0YXRzX25wcF9sZXZlbDAgPC0ga21Mb29TdGF0cyhrbSA9IGVtX25wcF9sZXZlbDApCmVycnN0YXRzX25wcF9sZXZlbDBfbXMgPC0ga21Mb29TdGF0cyhrbSA9IGVtX25wcF9sZXZlbDBfbXMpCgplcnJzdGF0c19ucHBfbGV2ZWwxIDwtIGttTG9vU3RhdHMoa20gPSBlbV9ucHBfbGV2ZWwxKQplcnJzdGF0c19ucHBfbGV2ZWwxX21zIDwtIGttTG9vU3RhdHMoa20gPSBlbV9ucHBfbGV2ZWwxX21zKQoKCiMgcHJvcG9ydGlvbmFsIG1lYW4gYWJzb2x1dGUgZXJyb3IKZXJyc3RhdHNfbnBwX2xldmVsMCRwbWFlCmVycnN0YXRzX25wcF9sZXZlbDBfbXMkcG1hZQoKCmVycnN0YXRzX25wcF9sZXZlbDEkcG1hZQplcnJzdGF0c19ucHBfbGV2ZWwxX21zJHBtYWUKCgoKCmBgYAoKCgoKCmBgYHtyfQojIERpY2VFdmFsIGlzIHVzZWZ1bCBidXQgc2xvdy9hd2t3YXJkCgojIERFX2VtX25wcF9sZXZlbDAgPC0gbW9kZWxGaXQoWCA9IFhfbGV2ZWwwLCBZID0geV9sZXZlbDAsIHR5cGUgPSAnS3JpZ2luZycsIGZvcm11bGEgPSB+LiApCiMgREVfZW1fbnBwX2xldmVsMSA8LSBtb2RlbEZpdChYID0gWF9sZXZlbDEsIFkgPSB5X2xldmVsMSwgdHlwZSA9ICdLcmlnaW5nJywgZm9ybXVsYSA9IH4uICkKCiMgbnBwX2VtX2N2X2xldmVsMCA8LSBjcm9zc1ZhbGlkYXRpb24oREVfZW1fbnBwX2xldmVsMCwgNSkKIyBucHBfZW1fY3ZfbGV2ZWwxICA8LSBjcm9zc1ZhbGlkYXRpb24oREVfZW1fbnBwX2xldmVsMSwgNSkKCmBgYAoKCgojIyBDb25zdHJhaW4gZmlyc3QgYW5kIHRoZW4gZG8gc2Vuc2l0aXZpdHkgYW5hbHlzaXM/ClRoZSBwcm9ibGVtIHdpdGggZG9pbmcgY29uc3RyYWludCBmaXJzdCBpcyB0aGF0IHlvdSBlbmQgdXAgd2l0aCBhIG5vbi1oeXBlcmN1YmUgc2hhcGVkIGlucHV0IHNwYWNlIChjb3JuZXJzIGhhdmUgYmVlbiBrbm9ja2VkIG9mZiBieSBjb25zdHJhaW50KSwgd2hpY2ggaXMgbm90IGlkZWFsLiBXZSBtaWdodCB0aGVyZWZvcmUgd2FudCBkaWZmZXJlbnQgc2Vuc2l0aXZpdHkgbWVhc3VyZXMgZm9yIHByZS0gYW5kIHBvc3QtY29uc3RyYWluZWQgZW5zZW1ibGUuCgoKYGBge3J9Cgojc2Vuc3ZhciBuZWVkcyB0byBnbyBpbnRvIGVtdG9vbHMgd2l0aCBvYWF0X2Rlc2lnbgpzZW5zdmFyIDwtIGZ1bmN0aW9uKG9hYXRfcHJlZCwgbiwgZCl7CiAgIyBDYWxjdWxhdGUgdmFyaWFuY2UgYXMgYSBnbG9iYWwgc2Vuc2l0aXZpdHkgbWVhbnN1cmUKICBvdXQgPSByZXAoTkEsZCkKICBmb3IoaSBpbiAxOmQpewogICAgaXggPSBzZXEoZnJvbSA9ICgoaSpuKSAtIChuLTEpKSwgdG8gPSAgKGkqbiksIGJ5ID0gMSkKICAgIG91dFtpXSA9IHZhcihvYWF0X3ByZWQkbWVhbltpeF0pCiAgfQogIG91dAp9CgoKYGBgCgoKYGBge3J9CnR3b1N0ZXBfZ2xtbmV0IDwtIGZ1bmN0aW9uKFgsIHksIG51Z2dldD1OVUxMLCBudWdnZXRFc3RpbT1GQUxTRSwgbm9pc2VWYXI9TlVMTCwgc2VlZD1OVUxMLCB0cmFjZT1GQUxTRSwgbWF4aXQ9MTAwLAogICAgICAgICAgICAgICAgICAgICAgICAgIFJFUE9SVD0xMCwgZmFjdHI9MWU3LCBwZ3RvbD0wLjAsIHBhcmluaXQ9TlVMTCwgcG9wc2l6ZT0xMDApewogICMgVXNlIGxhc3NvIHRvIHJlZHVjZSBpbnB1dCBkaW1lbnNpb24gb2YgZW11bGF0b3IgYmVmb3JlCiAgIyBidWlsZGluZy4KICBjb250cm9sX2xpc3QgPSBsaXN0KHRyYWNlPXRyYWNlLCBtYXhpdD1tYXhpdCwgUkVQT1JUPVJFUE9SVCwgZmFjdHI9ZmFjdHIsIHBndG9sPXBndG9sLCBwb3Auc2l6ZT1wb3BzaXplKQogIHh2YXJzID0gY29sbmFtZXMoWCkKICBkYXRhID0gZGF0YS5mcmFtZShyZXNwb25zZT15LCB4PVgpCiAgY29sbmFtZXMoZGF0YSkgPC0gYygicmVzcG9uc2UiLCB4dmFycykKICBudmFsID0gbGVuZ3RoKHkpCiAgCiAgIyBmaXQgYSBsYXNzbyBieSBjcm9zcyB2YWxpZGF0aW9uCiAgbGlicmFyeShnbG1uZXQpCiAgZml0X2dsbW5ldF9jdiA9IGN2LmdsbW5ldCh4PVgseT15KQogIAogICMgVGhlIGxhYmVscyBvZiB0aGUgcmV0YWluZWQgY29lZmZpY2llbnRzIGFyZSBoZXJlCiAgIyAocmV0YWlucyBpbnRlcmNlcHQgYXQgaW5kZXggemVybykKICBjb2VmX2kgPSAoY29lZihmaXRfZ2xtbmV0X2N2LCBzID0gImxhbWJkYS4xc2UiKSlAaQogIGxhYnMgPSBsYWJlbHMoY29lZihmaXRfZ2xtbmV0X2N2LCBzID0gImxhbWJkYS4xc2UiKSlbWzFdXQogIGxhYnMgPSBsYWJzWy0xXSAjIHJlbW92ZSBpbnRlcmNlcHQKICBnbG1uZXRfcmV0YWluZWQgPSBsYWJzW2NvZWZfaV0KICAKICBzdGFydF9mb3JtID0gYXMuZm9ybXVsYShwYXN0ZSgifiAiLCBwYXN0ZShnbG1uZXRfcmV0YWluZWQgLCBjb2xsYXBzZT0gIisiKSkpCiAgbSA9IGttKHN0YXJ0X2Zvcm0sIGRlc2lnbj1YLCByZXNwb25zZT15LCBudWdnZXQ9bnVnZ2V0LCBwYXJpbml0PXBhcmluaXQsCiAgICAgICAgIG51Z2dldC5lc3RpbT1udWdnZXRFc3RpbSwgbm9pc2UudmFyPW5vaXNlVmFyLCBjb250cm9sPWNvbnRyb2xfbGlzdCkKICAKICByZXR1cm4obGlzdCh4PVgsIHk9eSwgbnVnZ2V0PW51Z2dldCwgbnVnZ2V0RXN0aW09bnVnZ2V0RXN0aW0sCiAgICAgICAgICAgICAgbm9pc2VWYXI9bm9pc2VWYXIsIGVtdWxhdG9yPW0sIHNlZWQ9c2VlZCwgY29lZnM9bUBjb3ZhcmlhbmNlQHJhbmdlLnZhbCwKICAgICAgICAgICAgICB0cmVuZHM9bUB0cmVuZC5jb2VmLCBtZWFuVGVybXM9YWxsLnZhcnMoc3RhcnRfZm9ybSksIGZpdF9nbG1uZXRfY3Y9Zml0X2dsbW5ldF9jdikpCn0KYGBgCgoKYGBge3J9Cgp0d29TdGVwX3NlbnMgPC0gZnVuY3Rpb24oWCwgeSwgbj0yMSwgcHJlZHR5cGUgPSAnVUsnLCBudWdnZXQ9TlVMTCwgbnVnZ2V0RXN0aW09RkFMU0UsIG5vaXNlVmFyPU5VTEwsIHNlZWQ9TlVMTCwgdHJhY2U9RkFMU0UsIG1heGl0PTEwMCwKICAgICAgICAgICAgICAgICAgICAgICAgUkVQT1JUPTEwLCBmYWN0cj0xZTcsIHBndG9sPTAuMCwgcGFyaW5pdD1OVUxMLCBwb3BzaXplPTEwMCl7CiAgIyBTZW5zaXRpdml0eSBhbmFseXNpcyB3aXRoIHR3b1N0ZXAgZW11bGF0b3IuIAogICMgQ2FsY3VsYXRlcyB0aGUgdmFyaWFuY2Ugb2YgdGhlIG91dHB1dCB2YXJpZWQgb25lIGF0IGEgdGltZSBhY3Jvc3MgZWFjaCBpbnB1dC4KICBkID0gbmNvbChYKQogIFhfbm9ybSA8LSBub3JtYWxpemUoWCkKICBYX29hYXQgPC0gb2FhdF9kZXNpZ24oWF9ub3JtLCBuLCBtZWQgPSBUUlVFKQogIGNvbG5hbWVzKFhfb2FhdCkgPSBjb2xuYW1lcyhYKQogIAogIHR3b1N0ZXBfZW0gPSB0d29TdGVwX2dsbW5ldChYPVgsIHk9eSwgbnVnZ2V0PW51Z2dldCwgbnVnZ2V0RXN0aW09bnVnZ2V0RXN0aW0sIG5vaXNlVmFyPW5vaXNlVmFyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWVkPXNlZWQsIHRyYWNlPXRyYWNlLCBtYXhpdD1tYXhpdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUkVQT1JUPVJFUE9SVCwgZmFjdHI9ZmFjdHIsIHBndG9sPXBndG9sLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJpbml0PXBhcmluaXQsIHBvcHNpemU9cG9wc2l6ZSkKICAKICBvYWF0X3ByZWQgPSBwcmVkaWN0KHR3b1N0ZXBfZW0kZW11bGF0b3IsIG5ld2RhdGEgPSBYX29hYXQsIHR5cGUgPSBwcmVkdHlwZSkKICAKICBzZW5zID0gc2Vuc3ZhcihvYWF0X3ByZWQgPSBvYWF0X3ByZWQsIG49biwgZD1kKQogIG91dCA9IHNlbnMKICBvdXQKfQpgYGAKCgpgYGB7ciwgd2FybmluZz1GQUxTRSwgbWVzc2FnZSA9IEZBTFNFfQoKaWYgKGZpbGUuZXhpc3RzKCJvYXRfdHdvc3RlcC5yZGF0YSIpKSB7CiAgbG9hZCgib2F0X3R3b3N0ZXAucmRhdGEiKQp9IGVsc2UgewpvYXRfdGVzdCA8LSB0d29TdGVwX3NlbnMoWCA9IFhfbGV2ZWwxLCB5ID0geV9sZXZlbDEpCgoKc2F2ZShvYXRfdGVzdCwgZmlsZSA9ICJvYXRfdHdvc3RlcC5yZGF0YSIpCn0KCmBgYAoKCmBgYHtyfQp5X25hbWVzX3N1bSA8LSBjKCduYnBfbG5kX3N1bScsICdmTHVjX2xuZF9zdW0nLCAnbnBwX25saW1fbG5kX3N1bScsICdjU29pbF9sbmRfc3VtJywKICAgICAgICAgICAgJ2NWZWdfbG5kX3N1bScsICdsYW5kQ292ZXJGcmFjX2xuZF9zdW0nLCAnZkhhcnZlc3RfbG5kX3N1bScsCiAgICAgICAgICAgICdsYWlfbG5kX3N1bScsICdyaF9sbmRfc3VtJywgJ3RyZWVGcmFjX2xuZF9zdW0nLCAnYzNQZnRGcmFjX2xuZF9zdW0nLCAKICAgICAgICAgICAgJ2M0UGZ0RnJhY19sbmRfc3VtJywgJ3NocnViRnJhY19sbmRfc3VtJywgJ2JhcmVzb2lsRnJhY19sbmRfc3VtJykKCgoKCmlmIChmaWxlLmV4aXN0cygib2FhdF9ZLnJkYXRhIikpIHsKICBsb2FkKCJvYWF0X1kucmRhdGEiKQp9IGVsc2UgewogIAogIApvYXRfdmFyX3NlbnNtYXRfWSA8LSBtYXRyaXgoTkEsIG5yb3cgPSBsZW5ndGgoeV9uYW1lc19zdW0pLCBuY29sID0gbmNvbChYX2xldmVsMSkpCgpmb3IoaSBpbiAxOmxlbmd0aCh5X25hbWVzX3N1bSkpewogIAogIHluYW1lIDwtIHlfbmFtZXNfc3VtW2ldCiAgeSA8LSBZX2xldmVsMVssIHluYW1lXQogIG9hdCA8LSB0d29TdGVwX3NlbnMoWCA9IFhfbGV2ZWwxLCB5ID0geSkKICBvYXRfdmFyX3NlbnNtYXRfWVtpLCBdIDwtIG9hdAp9CgpzYXZlKHlfbmFtZXNfc3VtLCBvYXRfdmFyX3NlbnNtYXRfWSwgZmlsZSA9ICJvYWF0X1kucmRhdGEiKQp9CmBgYAoKIyMgSW5pdGlhbCBzZW5zaXRpdml0eSBNYXRyaXgKSXQgbG9va3MgYXMgdGhvdWdoIGJ3bF9pbyBpcyB2ZXJ5IGluZmx1ZW50aWFsIGFjcm9zcyBhIG51bWJlciBvZiB2YXJpYWJsZXMsIGV2ZW4gdGhvdWdoIGl0IGRpZG4ndCBhcHBlYXIgdGhhdCBpbnRlcmVzdGluZyBpbiB0aGUgcGFyZ2luYWwgcGxvdHMuIFdoeSBpcyB0aGF0PwoKYGBge3IsIGZpZy53aWR0aD0gMTAsIGZpZy5oZWlnaHQgPSA2fQojIG5vcm1hbGl6ZSB0aGUgc2Vuc2l0aXZpdHkgbWF0cml4CmNvbG5hbWVzKG9hdF92YXJfc2Vuc21hdF9ZKSA8LSBjb2xuYW1lcyhYX2xldmVsMSkKcm93bmFtZXMob2F0X3Zhcl9zZW5zbWF0X1kpIDwtIHlfbmFtZXNfc3VtCgojdGVzdCA8LSBub3JtYWxpemUodChvYXQudmFyLnNlbnNtYXQpKQoKI2ltYWdlKHRlc3QpCiNwYXIoKQpoZWF0bWFwKG9hdF92YXJfc2Vuc21hdF9ZLCBSb3d2ID0gTkEsIENvbHYgPSBOQSwgbWFyID0gYygxMCwxMCksIHNjYWxlID0gJ3JvdycpCmhlYXRtYXAob2F0X3Zhcl9zZW5zbWF0X1ksIG1hciA9IGMoMTAsMTApLCBzY2FsZSA9ICdyb3cnKQoKYGBgCgoKYGBge3IsIGZpZy53aWR0aCA9MTIsIGZpZy5oZWlnaHQgPSA3fQoKbm9ybXNlbnNfWSA8LSBub3JtYWxpemUodChvYXRfdmFyX3NlbnNtYXRfWSkpCgpwYXIobWFyID0gYygxMiwxMiw1LDIpKQppbWFnZShub3Jtc2Vuc19ZLCBheGVzID0gRkFMU0UsIGNvbCA9IGJsdWVzKQpheGlzKDEsIGF0ID0gc2VxKGZyb20gPSAwLCB0byA9IDEsIGxlbmd0aC5vdXQgPSBwKSwgbGFiZWxzID0gY29sbmFtZXMoWF9sZXZlbDEpLCBsYXMgPSAyKQpheGlzKDIsIGF0ID0gc2VxKGZyb20gPSAwLCB0byA9IDEsIGxlbmd0aC5vdXQgPSBsZW5ndGgoeV9uYW1lc19zdW0pKSwgbGFiZWxzID0geV9uYW1lc19zdW0sIGxhcyA9IDEpCm10ZXh0KCdPbmUtYXQtYS10aW1lIHNlbnNpdGl2aXR5LCB2YXJpYW5jZSBhY3Jvc3MgbGV2ZWwgMSBlbnNlbWJsZScsIHNpZGUgPSAzLCBhZGogPSAwLCBsaW5lID0gMiwgY2V4ID0gMS44KQoKYGBgCgoKCiMjIFJlLWV4YW1pbmUgYndsX2lvCkEgY2xvc2VyIGxvb2sgYXQgYndsX2lvIG5vdyB0aGF0IHRoZSBpbXBhY3Qgb2YgZjBfaW8gaGFzIGJlZW4gcmVtb3ZlZCBzaG93cyBhIGxhcmdlIG51bWJlciBvZiAiemVybyIgTlBQIHdoZW4gYndsX2lvIGlzIGF0IGxvdyB2YWx1ZXMsIHdoaWNoIGNvdWxkIHdlbGwgYmUgdGhlIHNvdXJjZSBvZiBhcHBhcmVudCBzZW5zaXRpdml0eS4KClRha2Ugb25seSBoaWdoZXIgdmFsdWVzIG9mIGJ3bF9pbyBmb3IgdGhlIG5leHQgcm91bmQgb2YgY29uc3RyYWludHMuCgpgYGB7ciwgZmlnLndpZHRoID0gMTIsIGZpZy5oZWlnaHQgPSAxMn0KCnAgPC0gbmNvbChYX2xldmVsMSkKCnlfbGV2ZWwxIDwtIFlfbGV2ZWwxWywnbnBwX25saW1fbG5kX3N1bSddCgpwYXIobWZyb3cgPSBjKDUsNyksIG1hciA9IGMoMywxLDMsMSkpCmZvcihpIGluIDE6cCl7CiAgcGxvdChYX2xldmVsMVssaV0sIHlfbGV2ZWwxLCB4bGFiID0gJycsIHlsYWIgPSAnJywgbWFpbiA9IGNvbG5hbWVzKFhfbGV2ZWwxKVtpXSkKfQoKYGBgCgojIFJlbW92ZSBlbnNlbWJsZSBtZW1iZXJzIHdpdGggbG93IGJfd2wgYW5kIHNlZSBpZiB0aGUgc2Vuc2l0aXZpdHkgYW5hbHlzZXMgY2hhbmdlIGFuZCB0aGUgZW11bGF0b3JzIGdldCBiZXR0ZXIuCgpgYGB7cn0KbGV2ZWwxYV9peCA8LSB3aGljaChYX2xldmVsMFssICdmMF9pbyddIDwgMC45ICYgWF9sZXZlbDBbLCAnYl93bF9pbyddID4gMC4xNSApCgpYX2xldmVsMWEgPC0gWF9sZXZlbDBbbGV2ZWwxYV9peCwgXQpZX2xldmVsMWEgPC0gWV9sZXZlbDBbbGV2ZWwxYV9peCxdCgpZQW5vbV9sZXZlbDFhIDwtIFlBbm9tX2xldmVsMFtsZXZlbDFhX2l4LCBdCgp5X2xldmVsMWEgPC0gWV9sZXZlbDFhWywgJ25wcF9ubGltX2xuZF9zdW0nXQoKYGBgCgoKYGBge3IsIGZpZy53aWR0aCA9IDcsIGZpZy5oZWlnaHQgPSA3LCByZXN1bHRzID0gJ2hpZGUnLCB3YXJuaW5nPUZBTFNFfQplbV9sZXZlbDFhIDwtIGttKH4uLCBkZXNpZ24gPSBYX2xldmVsMWEsICByZXNwb25zZSA9IHlfbGV2ZWwxYSkKYGBgCgoKICMgUGxvdCB0aGUgcmVndWxhciBrbSBlbXVsYXRvci4KCmBgYHtyLCBmaWcud2lkdGggPSA3LCBmaWcuaGVpZ2h0ID0gN30KcGxvdChlbV9sZXZlbDFhKQoKCmBgYAoKCmBgYHtyfQppZiAoZmlsZS5leGlzdHMoIm9hYXRfbGV2ZWwxYV9ZLnJkYXRhIikpIHsKICBsb2FkKCJvYWF0X2xldmVsMWFfWS5yZGF0YSIpCn0gZWxzZSB7CiAgCiAgCm9hdF92YXJfc2Vuc21hdF9sZXZlbDFhX1kgPC0gbWF0cml4KE5BLCBucm93ID0gbGVuZ3RoKHlfbmFtZXNfc3VtKSwgbmNvbCA9IG5jb2woWF9sZXZlbDFhKSkKCmZvcihpIGluIDE6bGVuZ3RoKHlfbmFtZXNfc3VtKSl7CiAgCiAgeW5hbWUgPC0geV9uYW1lc19zdW1baV0KICB5IDwtIFlfbGV2ZWwxYVssIHluYW1lXQogIG9hdCA8LSB0d29TdGVwX3NlbnMoWCA9IFhfbGV2ZWwxYSwgeSA9IHkpCiAgb2F0X3Zhcl9zZW5zbWF0X2xldmVsMWFfWVtpLCBdIDwtIG9hdAp9CgpzYXZlKHlfbmFtZXNfc3VtLCBvYXRfdmFyX3NlbnNtYXRfbGV2ZWwxYV9ZLCBmaWxlID0gIm9hYXRfbGV2ZWwxYV9ZLnJkYXRhIikKfQoKYGBgCgoKYGBge3IsIGZpZy53aWR0aCA9IDEyLCBmaWcuaGVpZ2h0ID0gMTJ9CgpwIDwtIG5jb2woWF9sZXZlbDFhKQoKeV9sZXZlbDFhIDwtIFlfbGV2ZWwxYVssJ25wcF9ubGltX2xuZF9zdW0nXQoKcGFyKG1mcm93ID0gYyg1LDcpLCBtYXIgPSBjKDMsMSwzLDEpKQpmb3IoaSBpbiAxOnApewogIHBsb3QoWF9sZXZlbDFhWyxpXSwgeV9sZXZlbDFhLCB4bGFiID0gJycsIHlsYWIgPSAnJywgbWFpbiA9IGNvbG5hbWVzKFhfbGV2ZWwxYSlbaV0sIHhsaW0gPSBjKDAsMSkpCn0KCmBgYAoKIyMgV2l0aCBiX3dsIHRydW5jYXRlZCwgd2UgY2FuIGNsZWFybHkgc2VlIHRoZSBzZW5zaXRpdml0aWVzIGNoYW5nZS4KCmBgYHtyLCBmaWcud2lkdGg9IDEwLCBmaWcuaGVpZ2h0ID0gNn0KIyBub3JtYWxpemUgdGhlIHNlbnNpdGl2aXR5IG1hdHJpeApjb2xuYW1lcyhvYXRfdmFyX3NlbnNtYXRfbGV2ZWwxYV9ZKSA8LSBjb2xuYW1lcyhYX2xldmVsMWEpCnJvd25hbWVzKG9hdF92YXJfc2Vuc21hdF9sZXZlbDFhX1kpIDwtIHlfbmFtZXNfc3VtCgojdGVzdCA8LSBub3JtYWxpemUodChvYXQudmFyLnNlbnNtYXQpKQoKI2ltYWdlKHRlc3QpCiNwYXIoKQpoZWF0bWFwKG9hdF92YXJfc2Vuc21hdF9sZXZlbDFhX1ksIFJvd3YgPSBOQSwgQ29sdiA9IE5BLCBtYXIgPSBjKDEwLDEwKSwgc2NhbGUgPSAncm93JykKaGVhdG1hcChvYXRfdmFyX3NlbnNtYXRfbGV2ZWwxYV9ZLCBtYXIgPSBjKDEwLDEwKSwgc2NhbGUgPSAncm93JykKCmBgYAoKCmBgYHtyLCBmaWcud2lkdGggPTEyLCBmaWcuaGVpZ2h0ID0gN30KCm5vcm1zZW5zX2xldmVsMWFfWSA8LSBub3JtYWxpemUodChvYXRfdmFyX3NlbnNtYXRfbGV2ZWwxYV9ZKSkKCnBhcihtYXIgPSBjKDEyLDEyLDUsMikpCmltYWdlKG5vcm1zZW5zX2xldmVsMWFfWSwgYXhlcyA9IEZBTFNFLCBjb2wgPSBibHVlcykKYXhpcygxLCBhdCA9IHNlcShmcm9tID0gMCwgdG8gPSAxLCBsZW5ndGgub3V0ID0gcCksIGxhYmVscyA9IGNvbG5hbWVzKFhfbGV2ZWwxYSksIGxhcyA9IDIpCmF4aXMoMiwgYXQgPSBzZXEoZnJvbSA9IDAsIHRvID0gMSwgbGVuZ3RoLm91dCA9IGxlbmd0aCh5X25hbWVzX3N1bSkpLCBsYWJlbHMgPSB5X25hbWVzX3N1bSwgbGFzID0gMSkKbXRleHQoJ09uZS1hdC1hLXRpbWUgc2Vuc2l0aXZpdHksIHZhcmlhbmNlIGFjcm9zcyBsZXZlbCAxYSBlbnNlbWJsZScsIHNpZGUgPSAzLCBhZGogPSAwLCBsaW5lID0gMiwgY2V4ID0gMS44KQoKYGBgCgoKCmBgYHtyfQojIFRoaXMgZmFpbHMgZm9yICJjVmVnX2xuZF9zdW0iCiMgVGhlIHJlc3VsdCB3aWxsIGJlIHRoYXQgc29tZSBvZiB0aGUgY29sdW1ucyBhcmUgcmVwZWF0ZWQuCgppZiAoZmlsZS5leGlzdHMoIm9hYXRfWUFub20ucmRhdGEiKSkgewogIGxvYWQoIm9hYXRfWUFub20ucmRhdGEiKQp9IGVsc2UgewoKb2F0X3Zhcl9zZW5zbWF0X1lBbm9tIDwtIG1hdHJpeChOQSwgbnJvdyA9IGxlbmd0aCh5X25hbWVzX3N1bSksIG5jb2wgPSBuY29sKFhfbGV2ZWwxKSkKCmZvcihpIGluIDE6bGVuZ3RoKHlfbmFtZXNfc3VtKSl7CiAgCiAgeW5hbWUgPC0geV9uYW1lc19zdW1baV0KICB5IDwtIFlBbm9tX2xldmVsMVssIHluYW1lXQogIHRyeShvYXQgPC0gdHdvU3RlcF9zZW5zKFggPSBYX2xldmVsMSwgeSA9IHkpKQogIG9hdF92YXJfc2Vuc21hdF9ZQW5vbVtpLCBdIDwtIG9hdAp9CgpzYXZlKHlfbmFtZXNfc3VtLCBvYXRfdmFyX3NlbnNtYXRfWUFub20sIGZpbGUgPSAib2FhdF9ZQW5vbS5yZGF0YSIpCgp9CmBgYAoKCgpgYGB7ciwgZmlnLndpZHRoPSAxMCwgZmlnLmhlaWdodCA9IDZ9CiMgbm9ybWFsaXplIHRoZSBzZW5zaXRpdml0eSBtYXRyaXgKY29sbmFtZXMob2F0X3Zhcl9zZW5zbWF0X1lBbm9tKSA8LSBjb2xuYW1lcyhYX2xldmVsMSkKcm93bmFtZXMob2F0X3Zhcl9zZW5zbWF0X1lBbm9tKSA8LSB5X25hbWVzX3N1bQoKI3Rlc3QgPC0gbm9ybWFsaXplKHQob2F0LnZhci5zZW5zbWF0KSkKCiNpbWFnZSh0ZXN0KQojcGFyKCkKaGVhdG1hcChvYXRfdmFyX3NlbnNtYXRfWUFub20sIFJvd3YgPSBOQSwgQ29sdiA9IE5BLCBtYXIgPSBjKDEwLDEwKSwgc2NhbGUgPSAncm93JykKaGVhdG1hcChvYXRfdmFyX3NlbnNtYXRfWUFub20sIG1hciA9IGMoMTAsNiksIHNjYWxlID0gJ3JvdycpCgpgYGAKCgpgYGB7ciwgZmlnLndpZHRoID0xMiwgZmlnLmhlaWdodCA9IDd9Cgpub3Jtc2Vuc19ZQW5vbSA8LSBub3JtYWxpemUodChvYXRfdmFyX3NlbnNtYXRfWUFub20pKQoKcGFyKG1hciA9IGMoMTIsMTIsNSwyKSkKaW1hZ2Uobm9ybXNlbnNfWUFub20sIGF4ZXMgPSBGQUxTRSwgY29sID0gYmx1ZXMpCmF4aXMoMSwgYXQgPSBzZXEoZnJvbSA9IDAsIHRvID0gMSwgbGVuZ3RoLm91dCA9IHApLCBsYWJlbHMgPSBjb2xuYW1lcyhYX2xldmVsMSksIGxhcyA9IDIpCmF4aXMoMiwgYXQgPSBzZXEoZnJvbSA9IDAsIHRvID0gMSwgbGVuZ3RoLm91dCA9IGxlbmd0aCh5X25hbWVzX3N1bSkpLCBsYWJlbHMgPSB5X25hbWVzX3N1bSwgbGFzID0gMSkKbXRleHQoJ09uZS1hdC1hLXRpbWUgc2Vuc2l0aXZpdHksIHZhcmlhbmNlIG9mIGhpc3RvcmljYWwgY2hhbmdlIGFjcm9zcyBsZXZlbCAxIGVuc2VtYmxlJywgc2lkZSA9IDMsIGFkaiA9IDAsIGxpbmUgPSAyLCBjZXggPSAxLjgpCgpgYGAKCgojIyBQbG90IGJvdGggc2Vuc2l0aXZpdHkgbWF0cmljZXMgb24gdG9wIG9mIG9uZSBhbm90aGVyLgpJdCBsb29rcyBhcyB0aG91Z2ggYm90aCB0aGUgYWJzb2x1dGUgdmFsdWUgYW5kIHRoZSBjaGFuZ2Ugb3ZlciB0aW1lIGFyZSBjb250cm9sbGVkIGJ5IHRoZSBzYW1lIHBhcmFtZXRlcnMuCmBgYHtyLCBmaWcud2lkdGggPTEyLCBmaWcuaGVpZ2h0ID0gMTJ9CnBhcihtZnJvdyA9IGMoMiwxKSwgbWFyID0gYygxMiwxMiw1LDIpKQoKaW1hZ2Uobm9ybXNlbnNfWSwgYXhlcyA9IEZBTFNFLCBjb2wgPSBibHVlcykKYXhpcygxLCBhdCA9IHNlcShmcm9tID0gMCwgdG8gPSAxLCBsZW5ndGgub3V0ID0gcCksIGxhYmVscyA9IGNvbG5hbWVzKFhfbGV2ZWwxKSwgbGFzID0gMikKYXhpcygyLCBhdCA9IHNlcShmcm9tID0gMCwgdG8gPSAxLCBsZW5ndGgub3V0ID0gbGVuZ3RoKHlfbmFtZXNfc3VtKSksIGxhYmVscyA9IHlfbmFtZXNfc3VtLCBsYXMgPSAxKQptdGV4dCgnT25lLWF0LWEtdGltZSBzZW5zaXRpdml0eSwgdmFyaWFuY2Ugb2YgaGlzdG9yaWNhbCBjaGFuZ2UgYWNyb3NzIGxldmVsIDEgZW5zZW1ibGUnLCBzaWRlID0gMywgYWRqID0gMCwgbGluZSA9IDIsIGNleCA9IDEuOCkKCgppbWFnZShub3Jtc2Vuc19ZQW5vbSwgYXhlcyA9IEZBTFNFLCBjb2wgPSBibHVlcykKYXhpcygxLCBhdCA9IHNlcShmcm9tID0gMCwgdG8gPSAxLCBsZW5ndGgub3V0ID0gcCksIGxhYmVscyA9IGNvbG5hbWVzKFhfbGV2ZWwxKSwgbGFzID0gMikKYXhpcygyLCBhdCA9IHNlcShmcm9tID0gMCwgdG8gPSAxLCBsZW5ndGgub3V0ID0gbGVuZ3RoKHlfbmFtZXNfc3VtKSksIGxhYmVscyA9IHlfbmFtZXNfc3VtLCBsYXMgPSAxKQptdGV4dCgnT25lLWF0LWEtdGltZSBzZW5zaXRpdml0eSwgdmFyaWFuY2Ugb2YgaGlzdG9yaWNhbCBjaGFuZ2UgYWNyb3NzIGxldmVsIDEgZW5zZW1ibGUnLCBzaWRlID0gMywgYWRqID0gMCwgbGluZSA9IDIsIGNleCA9IDEuOCkKCgpgYGAKCgojIyBIb3cgZ29vZCBhcmUgdGhlIGVtdWxhdG9ycyBmb3IgZWFjaCBvdXRwdXQ/ClRoZSBlbXVsYXRvcnMgYXBwZWFyIHRvIGJlIGF0IGxlYXN0IGNhcHR1cmluZyB0aGUgYnJvYWQgcmVzcG9uc2UgZm9yIGFsbCBvZiB0aGUgb3V0cHV0IHZhcmlhYmxlcy4KCkZpcnN0LCBwbG90IHRoZSBzdHJhaWdodCBrcmlnaW5nIGVtdWxhdG9ycwoKYGBge3IsIGZpZy53aWR0aCA9IDEyLCBmaWcuaGVpZ2h0ID0gNiwgcmVzdWx0cyA9ICdoaWRlJ30KCmlmIChmaWxlLmV4aXN0cygia21fZW11bGF0b3JzX1kucmRhdGEiKSkgewogIGxvYWQoImttX2VtdWxhdG9yc19ZLnJkYXRhIikKfSBlbHNlIHsKICAKICBlbWxpc3Rfa21fWSA8LSB2ZWN0b3IobW9kZSA9ICdsaXN0JywgbGVuZ3RoID0gbGVuZ3RoKHlfbmFtZXNfc3VtKSkKICAKICBmb3IoaSBpbiAxOmxlbmd0aCh5X25hbWVzX3N1bSkpewogICAgeW5hbWUgPC0geV9uYW1lc19zdW1baV0KICAgIHkgPC0gWV9sZXZlbDFbLCB5bmFtZV0KICAgIAogICAgZW0gPC0ga20ofi4sIGRlc2lnbiA9IFhfbGV2ZWwxLCByZXNwb25zZSA9IHkpCiAgICBlbWxpc3Rfa21fWVtbaV1dIDwtIGVtCiAgfQogIAogIGxvb2xpc3Rfa21fWSA8LSB2ZWN0b3IobW9kZSA9ICdsaXN0JywgbGVuZ3RoID0gbGVuZ3RoKHlfbmFtZXNfc3VtKSkKICAKICBmb3IoaSBpbiAxOmxlbmd0aCh5X25hbWVzX3N1bSkpewogICAgCiAgICBsb28gPC0gbGVhdmVPbmVPdXQua20obW9kZWwgPSBlbWxpc3Rfa21fWVtbaV1dLCB0eXBlID0gJ1VLJywgdHJlbmQucmVlc3RpbSA9IFRSVUUpCiAgICBsb29saXN0X2ttX1lbW2ldXSA8LSBsb28KICB9CiAgCiAgc2F2ZShlbWxpc3Rfa21fWSxsb29saXN0X2ttX1ksIGZpbGUgPSAia21fZW11bGF0b3JzX1kucmRhdGEiKQp9CgpgYGAKCmBgYHtyfQoKCmxvb3N0YXRzX2ttX1kgPC0gdmVjdG9yKG1vZGUgPSAnbGlzdCcsIGxlbmd0aCA9IGxlbmd0aCh5X25hbWVzX3N1bSkpCgpmb3IoaSBpbiAxOmxlbmd0aChlbWxpc3Rfa21fWSkpewogIAogIGxvb3N0YXRzIDwtIGttTG9vU3RhdHMoZW1saXN0X2ttX1lbW2ldXSkKICBsb29zdGF0c19rbV9ZW1tpXV0gPC0gbG9vc3RhdHMKICBwcmludChsb29zdGF0cyRwbWFlKQp9CgpgYGAKCgpgYGB7ciwgZmlnLndpZHRoID0gMTIsIGZpZy5oZWlnaHQgPSAxMn0KcGFyKG1mcm93ID0gYyg0LDQpLCBtYXIgPSBjKDMsNCwyLDIpLCBvbWEgPSBjKDQsNCw0LDAuMSkpCmZvcihpIGluIDE6bGVuZ3RoKGxvb2xpc3Rfa21fWSkpewogIAogIHkgPC0gWV9sZXZlbDFbLCB5X25hbWVzX3N1bVtpXV0KICBsb28gPC0gbG9vbGlzdF9rbV9ZW1tpXV0KICB5bGltIDwtIHJhbmdlKGMobG9vJG1lYW4gLSAoMipsb28kc2QpLCBsb28kbWVhbiArICgyKmxvbyRzZCkpICkKICBwbG90KHksIGxvbyRtZWFuLCB4bGFiID0gJycsIHlsYWIgPSAnJywgbWFpbiA9IHlfbmFtZXNfc3VtW2ldICwgeWxpbSA9IHlsaW0sIGNvbCA9IG1ha2VUcmFuc3BhcmVudCgnYmxhY2snLCA3MCksCiAgICAgICBwY2ggPSAxOSkKICBzZWdtZW50cyh4MCA9IHksIHkwID0gbG9vJG1lYW4gLSAoMipsb28kc2QpICAsIHgxID0geSAsIHkxID0gbG9vJG1lYW4gKyAoMipsb28kc2QpLCBjb2wgPSBtYWtlVHJhbnNwYXJlbnQoJ2JsYWNrJywgNzApKQogIGFibGluZSgwLDEpCiAgbGVnZW5kKCdib3R0b21yaWdodCcsbGVnZW5kID0gcGFzdGUoJ21hZSA9Jyxyb3VuZChsb29zdGF0c19rbV9ZW1tpXV0kcG1hZSwyKSwnJScpICwgYnR5ID0gJ24nKQoKfQoKbXRleHQoJ0FjdHVhbCcsIHNpZGUgPSAxLCBsaW5lID0gMSwgb3V0ZXIgPSBUUlVFLCBjZXggPSAyICkKbXRleHQoJ1ByZWRpY3RlZCcsIHNpZGUgPSAyLCBsaW5lID0gMCwgb3V0ZXIgPSBUUlVFLCBjZXggPSAyKSAKbXRleHQoJ01vZGVybiBWYWx1ZSAoWSknLCBzaWRlID0gMywgbGluZSA9IDAsIG91dGVyID0gVFJVRSwgY2V4ID0gMikgCgpgYGAKCmBgYHtyLCBmaWcud2lkdGggPSAxMiwgZmlnLmhlaWdodCA9IDYsIHJlc3VsdHMgPSAnaGlkZSd9CgppZiAoZmlsZS5leGlzdHMoImttX2VtdWxhdG9yc19ZQW5vbS5yZGF0YSIpKSB7CiAgbG9hZCgia21fZW11bGF0b3JzX1lBbm9tLnJkYXRhIikKfSBlbHNlIHsKICAKICBlbWxpc3Rfa21fWUFub20gPC0gdmVjdG9yKG1vZGUgPSAnbGlzdCcsIGxlbmd0aCA9IGxlbmd0aCh5X25hbWVzX3N1bSkpCiAgCiAgZm9yKGkgaW4gMTpsZW5ndGgoeV9uYW1lc19zdW0pKXsKICAgIHluYW1lIDwtIHlfbmFtZXNfc3VtW2ldCiAgICB5IDwtIFlBbm9tX2xldmVsMVssIHluYW1lXQogICAgCiAgICBlbSA8LSBrbSh+LiwgZGVzaWduID0gWF9sZXZlbDEsIHJlc3BvbnNlID0geSkKICAgIGVtbGlzdF9rbV9ZQW5vbVtbaV1dIDwtIGVtCiAgfQogIAogIGxvb2xpc3Rfa21fWUFub20gPC0gdmVjdG9yKG1vZGUgPSAnbGlzdCcsIGxlbmd0aCA9IGxlbmd0aCh5X25hbWVzX3N1bSkpCiAgCiAgZm9yKGkgaW4gMTpsZW5ndGgoeV9uYW1lc19zdW0pKXsKICAgIAogICAgbG9vIDwtIGxlYXZlT25lT3V0LmttKG1vZGVsID0gZW1saXN0X2ttX1lBbm9tW1tpXV0sIHR5cGUgPSAnVUsnLCB0cmVuZC5yZWVzdGltID0gVFJVRSkKICAgIGxvb2xpc3Rfa21fWUFub21bW2ldXSA8LSBsb28KICB9CiAgCiAgc2F2ZShlbWxpc3Rfa21fWUFub20sbG9vbGlzdF9rbV9ZQW5vbSwgZmlsZSA9ICJrbV9lbXVsYXRvcnNfWUFub20ucmRhdGEiKQp9CgpgYGAKCgojIGttIGVtdWxhdG9ycyBmb3IgY2hhbmdlIGluIHZhcmlhYmxlcyBvdmVyIHRpbWUKCmBgYHtyLCBmaWcud2lkdGggPSAxMiwgZmlnLmhlaWdodCA9IDEyfQpwYXIobWZyb3cgPSBjKDQsNCksIG1hciA9IGMoMyw0LDIsMiksIG9tYSA9IGMoNCw0LDQsMC4xKSkKZm9yKGkgaW4gMTpsZW5ndGgobG9vbGlzdF9rbV9ZQW5vbSkpewogIAogIHkgPC0gWUFub21fbGV2ZWwxWywgeV9uYW1lc19zdW1baV1dCiAgbG9vIDwtIGxvb2xpc3Rfa21fWUFub21bW2ldXQogIHlsaW0gPC0gcmFuZ2UoYyhsb28kbWVhbiAtICgyKmxvbyRzZCksIGxvbyRtZWFuICsgKDIqbG9vJHNkKSkgKQogIHBsb3QoeSwgbG9vJG1lYW4sIHhsYWIgPSAnJywgeWxhYiA9ICcnLCBtYWluID0geV9uYW1lc19zdW1baV0gLCB5bGltID0geWxpbSwgY29sID0gbWFrZVRyYW5zcGFyZW50KCdibGFjaycsIDcwKSwKICAgICAgIHBjaCA9IDE5KQogIHNlZ21lbnRzKHgwID0geSwgeTAgPSBsb28kbWVhbiAtICgyKmxvbyRzZCkgICwgeDEgPSB5ICwgeTEgPSBsb28kbWVhbiArICgyKmxvbyRzZCksIGNvbCA9IG1ha2VUcmFuc3BhcmVudCgnYmxhY2snLCA3MCkpCiAgYWJsaW5lKDAsMSkKICAKCn0KCm10ZXh0KCdBY3R1YWwnLCBzaWRlID0gMSwgbGluZSA9IDEsIG91dGVyID0gVFJVRSwgY2V4ID0gMiApCm10ZXh0KCdQcmVkaWN0ZWQnLCBzaWRlID0gMiwgbGluZSA9IDAsIG91dGVyID0gVFJVRSwgY2V4ID0gMikgCm10ZXh0KCdDaGFuZ2Ugb3ZlciB0aW1lIChZQW5vbSknLCBzaWRlID0gMywgbGluZSA9IDEsIG91dGVyID0gVFJVRSwgY2V4ID0gMikgCgpgYGAKCk5leHQsIHBsb3QgdGhlIHR3b3N0ZXAgZ2xtbmV0L2ttIGVtdWxhdG9ycwoKYGBge3IsIGZpZy53aWR0aCA9IDEyLCBmaWcuaGVpZ2h0ID0gNn0KIyBUd29zdGVwIGdsbW5ldCBlbXVsYXRvcnMKCmlmIChmaWxlLmV4aXN0cygidHNfZW11bGF0b3JzX1kucmRhdGEiKSkgewogIGxvYWQoInRzX2VtdWxhdG9yc19ZLnJkYXRhIikKfSBlbHNlIHsKICAKICBlbWxpc3RfdHdvU3RlcF9nbG1uZXRfWSA8LSB2ZWN0b3IobW9kZSA9ICdsaXN0JywgbGVuZ3RoID0gbGVuZ3RoKHlfbmFtZXNfc3VtKSkKICAKICBmb3IoaSBpbiAxOmxlbmd0aCh5X25hbWVzX3N1bSkpewogICAgCiAgICB5bmFtZSA8LSB5X25hbWVzX3N1bVtpXQogICAgeSA8LSBZX2xldmVsMVssIHluYW1lXQogICAgCiAgICBlbSA8LSB0d29TdGVwX2dsbW5ldChYID0gWF9sZXZlbDEsIHkgPSB5KQogICAgZW1saXN0X3R3b1N0ZXBfZ2xtbmV0X1lbW2ldXSA8LSBlbQogIH0KICAKICBsb29saXN0X3R3b1N0ZXBfZ2xtbmV0X1kgPC0gdmVjdG9yKG1vZGUgPSAnbGlzdCcsIGxlbmd0aCA9IGxlbmd0aCh5X25hbWVzX3N1bSkpCiAgCiAgZm9yKGkgaW4gMTpsZW5ndGgoeV9uYW1lc19zdW0pKXsKICAgIAogICAgbG9vIDwtIGxlYXZlT25lT3V0LmttKG1vZGVsID0gZW1saXN0X3R3b1N0ZXBfZ2xtbmV0X1lbW2ldXSRlbXVsYXRvciwgdHlwZSA9ICdVSycsIHRyZW5kLnJlZXN0aW0gPSBUUlVFKQogICAgbG9vbGlzdF90d29TdGVwX2dsbW5ldF9ZW1tpXV0gPC0gbG9vCiAgfQogIAogIAogIAogIHNhdmUoZW1saXN0X3R3b1N0ZXBfZ2xtbmV0X1ksIGxvb2xpc3RfdHdvU3RlcF9nbG1uZXRfWSwgZmlsZSA9ICJ0c19lbXVsYXRvcnNfWS5yZGF0YSIpCgp9CgoKYGBgCgpgYGB7cn0KIyBDYW4gZ2V0IG51bWVyaWNhbCBwZXJmb3JtYW5jZSB1c2luZwoKbG9vc3RhdHNfdHdvU3RlcF9nbG1uZXRfWSA8LSB2ZWN0b3IobW9kZSA9ICdsaXN0JywgbGVuZ3RoID0gbGVuZ3RoKHlfbmFtZXNfc3VtKSkKCmZvcihpIGluIDE6bGVuZ3RoKGVtbGlzdF90d29TdGVwX2dsbW5ldF9ZKSl7CiAgCiAgbG9vc3RhdHMgPC0ga21Mb29TdGF0cyhlbWxpc3RfdHdvU3RlcF9nbG1uZXRfWVtbaV1dJGVtdWxhdG9yKQogIGxvb3N0YXRzX3R3b1N0ZXBfZ2xtbmV0X1lbW2ldXSA8LSBsb29zdGF0cwogIHByaW50KGxvb3N0YXRzJHBtYWUpCn0KCgpgYGAKCgoKIyMgVHdvU3RlcCBlbXVsYXRvciBwZXJmb3JtYW5jZSBmb3IgbW9kZXJuIHZhbHVlcwoKYGBge3IsIGZpZy53aWR0aCA9IDEyLCBmaWcuaGVpZ2h0ID0gMTJ9CnBhcihtZnJvdyA9IGMoNCw0KSwgbWFyID0gYygzLDQsMiwyKSwgb21hID0gYyg0LDQsNCwwLjEpKQpmb3IoaSBpbiAxOmxlbmd0aChsb29saXN0X3R3b1N0ZXBfZ2xtbmV0X1kpKXsKICAKICB5IDwtIFlfbGV2ZWwxWywgeV9uYW1lc19zdW1baV1dCiAgbG9vIDwtIGxvb2xpc3RfdHdvU3RlcF9nbG1uZXRfWVtbaV1dCiAgeWxpbSA8LSByYW5nZShjKGxvbyRtZWFuIC0gKDIqbG9vJHNkKSwgbG9vJG1lYW4gKyAoMipsb28kc2QpKSApCiAgcGxvdCh5LCBsb28kbWVhbiwgeGxhYiA9ICcnLCB5bGFiID0gJycsIG1haW4gPSB5X25hbWVzX3N1bVtpXSAsIHlsaW0gPSB5bGltLCBjb2wgPSBtYWtlVHJhbnNwYXJlbnQoJ2JsYWNrJywgNzApLAogICAgICAgcGNoID0gMTkpCiAgc2VnbWVudHMoeDAgPSB5LCB5MCA9IGxvbyRtZWFuIC0gKDIqbG9vJHNkKSAgLCB4MSA9IHkgLCB5MSA9IGxvbyRtZWFuICsgKDIqbG9vJHNkKSwgY29sID0gbWFrZVRyYW5zcGFyZW50KCdibGFjaycsIDcwKSkKICBhYmxpbmUoMCwxKQogIGxlZ2VuZCgnYm90dG9tcmlnaHQnLGxlZ2VuZCA9IHBhc3RlKCdtYWUgPScscm91bmQobG9vc3RhdHNfdHdvU3RlcF9nbG1uZXRfWVtbaV1dJHBtYWUsMiksJyUnKSAsIGJ0eSA9ICduJykKCn0KCm10ZXh0KCdBY3R1YWwnLCBzaWRlID0gMSwgbGluZSA9IDEsIG91dGVyID0gVFJVRSwgY2V4ID0gMiApCm10ZXh0KCdQcmVkaWN0ZWQnLCBzaWRlID0gMiwgbGluZSA9IDAsIG91dGVyID0gVFJVRSwgY2V4ID0gMikgCm10ZXh0KCdNb2Rlcm4gVmFsdWUgKFkpJywgc2lkZSA9IDMsIGxpbmUgPSAwLCBvdXRlciA9IFRSVUUsIGNleCA9IDIpIAoKYGBgCgojIENvbXBhcmUgTGVhdmUtb25lLW91dCBzdGF0aXN0aWNzIGZvciB0aGUgdHdvIHR5cGVzIG9mIGVtdWxhdG9yCgpXZSB1c2UgdGhlIGxlYXZlLW9uZS1vdXQgTWVhbiBBYnNvbHV0ZSBFcnJvciwgZXhwcmVzc2VkIGFzIGEgcGVyY2VudGFnZSBvZiB0aGUgcmFuZ2Ugb2YgdGhlIG91dHB1dCBhY3Jvc3MgdGhlIGVuc2VtYmxlLiBXZSBmaW5kIHRoYXQgdGhlIHR3b3N0ZXAgZW11bGF0b3Jpc24ndCBzaWduaWZpY2FudGx5IG1vcmUgYWNjdXJhdGUsIGFuZCBpcyBpbmRlZWQgKmxlc3MqIGFjY3VyYXRlIGZvciB0cmVlIGZyYWN0aW9uLgoKYGBge3IsIGZpZy53aWR0aCA9IDgsIGZpZy5oZWlnaHQgPSA3fQoKCmttX3BtYWUgPC0gc2FwcGx5KGxvb3N0YXRzX2ttX1ksICdbWycsICdwbWFlJykKdHNfcG1hZSA8LSBzYXBwbHkobG9vc3RhdHNfdHdvU3RlcF9nbG1uZXRfWSwgJ1tbJywgJ3BtYWUnKQoKcGFyKG1hciA9IGMoMTIsNCwyLDEpLCBsYXMgPTEgKQpwbG90KDE6bGVuZ3RoKHlfbmFtZXNfc3VtKSwga21fcG1hZSwKICAgICB5bGltID0gYygwLDE1KSwgcGNoID0gMTksCiAgICAgYXhlcyA9IEZBTFNFLCB4bGFiID0gJycsIAogICAgIHlsYWIgPSAnTE9PIE1BRSAoJSBvZiByYW5nZSknLAogICAgIGNleCA9IDEuMikKcG9pbnRzKDE6bGVuZ3RoKHlfbmFtZXNfc3VtKSx0c19wbWFlICwgY29sPSAncmVkJywgcGNoID0gMTksIGNleCA9IDEuMikKbGVnZW5kKCd0b3BsZWZ0JywgYygna20gZW11bGF0b3InLCAndHdvU3RlcCBlbXVsYXRvcicpLCBwY2ggPSAxOSwgY29sID0gYygnYmxhY2snLCAncmVkJyksIHB0LmNleCA9IDEuMikKYXhpcyAoMikKcGFyKGxhcyA9IDIpCmF4aXMoMSwgYXQgPSAxOmxlbmd0aCh5X25hbWVzX3N1bSksIGxhYmVscyA9IHlfbmFtZXNfc3VtKQoKYGBgCgoKCmBgYHtyfQoKIyBXcml0ZSBhbiBlbXVsYXRvciB3cmFwcGVyCgojIFdyaXRlIGEgbGVhdmUtb25lLW91dCB3cmFwcGVyCgojIENyZWF0ZSBhIGxpc3Qgb2YgZW11bGF0b3IgZml0cywgZm9yIGJvdGgga20gYW5kIHR3b1N0ZXAgbWV0aG9kcy4KIyBVc2UgbWNsYXBwbHkgdG8gYnVpbGQgdGhlIGxpc3RzCiMgdXNlIGNvZGUgZnJvbSBIREUgcGFja2FnZQojIE1ha2Ugc3VyZSBlcnJvcnMgYXJlIGhhbmRsZWQgYWRlcXVhdGVseS4KCgojIENhbiB3ZSB3cml0ZSBpdCB0byB1c2UgYW55IGVtdWxhdG9yPyAoaS5lIGttLCB0d29zdGVwLCBzb21ldGhpbmcgZnJvbSBhbm90aGVyIHBhY2thZ2U/KQpgYGAKCgoKIyBIaXN0b3J5IG1hdGNoaW5nIGFuZCBnZW5lcmF0aW9uIG9mIG5ldyBlbnNlbWJsZSBtZW1iZXJzClRvIHVzZSBIaXN0b3J5IE1hdGNoaW5nLCB3ZSBuZWVkIHRvIHNwZWNpZnkgdGFyZ2V0cyBmb3IgdmFyaW91cyBtb2RlbCBvdXRwdXRzLiBXZSB0cmVhdCB0aGVzZSB0YXJnZXRzIGFzICJvYnNlcnZhdGlvbnMiIHdpdGggYW4gdW5jZXJ0YWludHkgd2hlcmUgYSBtb2RlbCBydW4gbWFya2VkIGFzICJpbXBsYXVzaWJsZSIgKGJleW9uZCAzc2QpIG1hdGNoZXMgdGhlIGhhcmQgYm91bmRhcmllcyBwcmV2aW91c2x5IGlkZW50aWZpZWQgYnkgQS4gV2lsdHNoaXJlIGFzIGJlaW5nIGRlc2lyYWJsZS4KCkNob29zZSB0aGUgY2VudHJlIG9mIHRoZSAoaW1wbGllZCkgdW5pZm9ybSBkaXN0cmlidXRpb24uCiBjc19nYi50YXJnZXQgPSAoMzAwMCAtIDc1MCkgLyAyID0gIDExMjUKIGN2LnRhcmdldCA9ICg4MDAgLSAzMDApIC8gMiA9IDI1MAogbnBwX25fZ2IudGFyZ2V0ID0gKDgwIC0gMzUpIC8gMiA9IDIyLjUKCiBuYnAudGFyZ2V0ID0gMAogKGdwcC50YXJnZXQgPSA3NSkKIChydW5vZmYudGFyZ2V0ID0gMSkKIAoodG8gZG86IHZpc3VhbGlzZSBpbXBsYXVzaWJpbGl0eSBvZiBkZXNpZ24gYW5kIGxvbyBlbXVsYXRlZCB2YWx1ZXMgb2YgZGVzaWduIGFzIGhpc3RvZ3JhbSkgCgpgYGB7cn0KCiNZLnRhcmdldCA9IGMoY3NfZ2IudGFyZ2V0LCBjdi50YXJnZXQsIG5wcF9uX2diLnRhcmdldCwgcnVub2ZmLnRhcmdldCwgbmJwLnRhcmdldCkKCnluYW1lc19jb25zdCA8LSBjKCduYnBfbG5kX3N1bScsICducHBfbmxpbV9sbmRfc3VtJywgJ2NTb2lsX2xuZF9zdW0nLCAnY1ZlZ19sbmRfc3VtJykKeXVuaXRzX2NvbnN0IDwtIGMoJ0d0Qy95ZWFyJywgJ0d0Qy95ZWFyJywgJ0d0QycsICdHdEMnKQpZX2NvbnN0X2xldmVsMWEgPC0gWV9sZXZlbDFhWywgeW5hbWVzX2NvbnN0XQoKc2NhbGV2ZWMgPC0gYygxZTEyL3lzZWMsIDFlMTIveXNlYywgMWUxMiwgMWUxMikKWV9jb25zdF9sZXZlbDFhX3NjYWxlZCA8LSBzd2VlcChZX2NvbnN0X2xldmVsMWEsIDIsIFNUQVRTID0gc2NhbGV2ZWMsIEZVTiA9ICcvJyApCgojIFRoaXMgaXMgYSAibm9ybWFsaXNhdGlvbiB2ZWN0b3IiLCBmb3IgbWFraW5nIHRoZSBvdXRwdXQgbnVtYmVycyBtb3JlIG1hbmFnZWFibGUuCiNjc19nYiAgICAgICBjdiAgICBncHBfZ2IgICAgICAgIG5icCBucHBfbl9nYiAgICBydW5vZmYKbm9ybV92ZWMgPSBjKDFlMTIsIDFlMTIsIDFlMTIveXNlYyAsIDFlMTIsIDFlMTIsIDFlOSkKCiMgbmJwICBucHAgIGNzb2lsICBjdmVnCllfbG93ZXIgPC0gYygtMTAsIDM1LCA3NTAsIDMwMCkKWV91cHBlciA8LSBjKDEwLCA4MCwgMzAwMCwgODAwKQoKIyBJJ20gZ29pbmcgdG8gc2V0IGl0IHNvIHRoYXQgKyA0c2QgYWxpZ25zIGFwcHJveGltYXRlbHkgd2l0aCB0aGUgb3JpZ2luYWwgbGltaXRzCiMgZ2l2ZW4gYnkgQW5keSBXaWx0c2hpcmUuIFRoaXMgZ2l2ZXMgcm9vbSBmb3IgdW5jZXJ0YWludHkgZnJvbSB0aGUgZW11bGF0b3IKWV90YXJnZXQgPSBZX3VwcGVyIC0gKGFicyhZX3VwcGVyIC0gKFlfbG93ZXIpKSAvIDIgKSMgYWJzKCkgdG8gZml4IHRoZSBwcm9ibGVtIHdpdGggbmVnYXRpdmUgbnVtYmVycwoKCiMgc3RhbmRhcmQgZGV2aWF0aW9uIGlzIGRlcml2ZWQgZnJvbSB0aGUgbGltaXRzIGFuZCB0aGUgY2VudHJhbCB0YXJnZXQKIyAodGhpcyBkaXN0YW5jZSBpcyBhc3N1bWVkIHRvIGJlIDQgc3RhbmRhcmQgZGV2aWF0aW9ucy4KWV9zZCA9IChZX3VwcGVyIC0gWV90YXJnZXQpIC8gNApuYW1lcyhZX3NkKSA9IGNvbG5hbWVzKFlfY29uc3RfbGV2ZWwxYV9zY2FsZWQpCgoKcCA9IG5jb2woWV9jb25zdF9sZXZlbDFhX3NjYWxlZCkKCm9ic19zZF9saXN0ID0gYXMubGlzdChyZXAoMC4wMSxwKSkKZGlzY19saXN0ID0gIGFzLmxpc3QocmVwKDAscCkpIApkaXNjX3NkX2xpc3QgPSAgYXMubGlzdChZX3NkKQp0aHJlcyA9IDMKCm1pbnNfYXVnID0gYXBwbHkoWF9sZXZlbDFhLCAyLCBGVU4gPSBtaW4pCm1heGVzX2F1ZyA9YXBwbHkoWF9sZXZlbDFhLCAyLCBGVU4gPSBtYXgpCgojIGNvbnZlcnQgWV90YXJnZXQgZm9yIGluZ2VzdGlvbiBpbnRvIGZ1bmN0aW9uCllfdGFyZ2V0ID0gbWF0cml4KFlfdGFyZ2V0LCBucm93ID0gMSkKCmBgYAoKCiMjIHZpc3VhbGlzZSB0aGUgY29uc3RyYWludHMKYGBge3J9CgojIEhpc3RvZ3JhbSBvZiBsZXZlbCAxIGNvbnN0cmFpbnRzCmhjb2wgPSAnZGFya2dyZXknCmxjb2wgPSAnYmxhY2snCnBhcihtZnJvdyA9IGMoMiwyKSwgZmcgPSAnZGFya2dyZXknLCBsYXMgPSAxKQoKCgpoaXN0KFlfY29uc3RfbGV2ZWwxYV9zY2FsZWRbLCduYnBfbG5kX3N1bSddLCBjb2wgPSBoY29sLCBtYWluID0gJ05CUCcsIHhsYWIgPSAnR3RDL3llYXInKQpwb2x5Z29uKHggPSBjKC0xMCwgMTAwLCAxMDAsIC0xMCksIHkgPSBjKDAsIDAsIDEwMDAsIDEwMDApLAogICAgICAgIGNvbCA9IG1ha2VUcmFuc3BhcmVudCgndG9tYXRvMicpLAogICAgICAgIGJvcmRlciA9IG1ha2VUcmFuc3BhcmVudCgndG9tYXRvMicpKQoKaGlzdChZX2NvbnN0X2xldmVsMWFfc2NhbGVkWywnbnBwX25saW1fbG5kX3N1bSddLCBjb2wgPSBoY29sICwgbWFpbiA9ICdOUFAnLCB4bGFiID0gJ0d0Qy95ZWFyJykKcG9seWdvbih4ID0gYygzNSwgODAsIDgwLCAzNSksIHkgPSBjKDAsIDAsIDEwMDAsIDEwMDApLAogICAgICAgIGNvbCA9IG1ha2VUcmFuc3BhcmVudCgndG9tYXRvMicpLAogICAgICAgIGJvcmRlciA9IG1ha2VUcmFuc3BhcmVudCgndG9tYXRvMicpKQoKCiAgICAgICAgaGlzdChZX2NvbnN0X2xldmVsMWFfc2NhbGVkWywnY1NvaWxfbG5kX3N1bSddLCBjb2wgPSBoY29sLCBtYWluID0gJ1NvaWwgQ2FyYm9uJywgeGxhYiA9ICdHdEMnKQpwb2x5Z29uKHggPSBjKDc1MCwgMzAwMCwgMzAwMCwgNzUwKSwgeSA9IGMoMCwgMCwgMTAwMCwgMTAwMCksCiAgICAgICAgY29sID0gbWFrZVRyYW5zcGFyZW50KCd0b21hdG8yJyksCiAgICAgICAgYm9yZGVyID0gbWFrZVRyYW5zcGFyZW50KCd0b21hdG8yJykpCgpoaXN0KFlfY29uc3RfbGV2ZWwxYV9zY2FsZWRbLCdjVmVnX2xuZF9zdW0nXSwgY29sID0gaGNvbCwgbWFpbiA9ICdWZWdldGF0aW9uIENhcmJvbicsIHhsYWIgPSAnR3RDJykKcG9seWdvbih4ID0gYygzMDAsIDgwMCwgODAwLCAzMDApLCB5ID0gYygwLCAwLCAxMDAwLCAxMDAwKSwKICAgICAgICBjb2wgPSBtYWtlVHJhbnNwYXJlbnQoJ3RvbWF0bzInKSwKICAgICAgIGJvcmRlciA9ICBtYWtlVHJhbnNwYXJlbnQoJ3RvbWF0bzInKSkKCmBgYAoKIyMgVGltZXNlcmllcyB0aGF0IG1hdGNoIHRoZSBjb25zdHJhaW50cy4KUGxvdCB0aGUgb3JpZ2luYWwgZW5zZW1ibGUsIHBsdXMgdGhlIHN0dWZmIHRoYXQgbWF0Y2hlcyB0aGUgY29uc3RyYWludHMuIEluY2x1ZGUgYW5vbWFsaWVzLgoKYGBge3IsIGZpZy53aWR0aCA9IDEyLCBmaWcuaGVpZ2h0ID0gOX0KCiMgcmVtb3ZlIHRvIGxldmVsIDFhIFJlbGF0aXZlIHRvIHRvcGxldmVsX2l4CnRvcGxldmVsX3RvX2xldmVsXzFhX2l4IDwtKHRvcGxldmVsX2l4Wy1ZX25sZXZlbDBfaXhdKVtsZXZlbDFhX2l4XQoKIyBTbyBmdXJ0aGVyIGNvbnN0cmFpbmluZyB0byBsZXZlbCAyIGNhbiBiZSBhc3NvY2lhdGVkIGJhY2sgdG8gdGhlIHRvcCBsZXZlbC4KCmxldmVsMl9peCA9IHdoaWNoKFlfY29uc3RfbGV2ZWwxYV9zY2FsZWRbLCduYnBfbG5kX3N1bSddID4gLTEwICYKICAgICAgICAgICAgICAgICAgICBZX2NvbnN0X2xldmVsMWFfc2NhbGVkWywnbnBwX25saW1fbG5kX3N1bSddID4gMzUgJiAgWV9jb25zdF9sZXZlbDFhX3NjYWxlZFssJ25wcF9ubGltX2xuZF9zdW0nXSA8IDgwICYKICAgICAgICAgICAgICAgICAgICBZX2NvbnN0X2xldmVsMWFfc2NhbGVkWywnY1NvaWxfbG5kX3N1bSddID4gNzUwICYgWV9jb25zdF9sZXZlbDFhX3NjYWxlZFssJ2NTb2lsX2xuZF9zdW0nXSA8IDMwMDAgJgogICAgICAgICAgICAgICAgICBZX2NvbnN0X2xldmVsMWFfc2NhbGVkWywnY1ZlZ19sbmRfc3VtJ10gPiAzMDAgJiBZX2NvbnN0X2xldmVsMWFfc2NhbGVkWywnY1ZlZ19sbmRfc3VtJ10gPCA4MDAKICApCmBgYAoKCldlIGZpbmQgdGhhdCBhZGRpbmcgYSBjb25zdHJhaW50IHRvIGxldmVsIDIgY29uc3RyYWlucyB0aGUgYmVoYXZpb3VyIG9mIHRoZSBzb2lsIGNhcmJvbiBwb29sLCBidXQgbm90IHRoZSB2ZWdldGF0aW9uIGNhcmJvbiBwb29sLiBQcm9iYWJseSBub3QgYSBzdXJwcmlzZSwgZ2l2ZW4gdGhlIFNvaWwgQ2FyYm9uIHBvb2wgKGFuZCBjaGFuZ2VzKSBhcmUgbXVjaCBsYXJnZXIgdGhhbiB0aGUgdmVnZXRhdGlvbiBjYXJib24gcG9vbC4KCmBgYHtyIHZlZ0Mtc29pbEMtY29uc3RyYWluZWQsIGZpZy53aWR0aCA9IDEyLCBmaWcuaGVpZ2h0ID0gOH0KI2NTb2lsX2Vuc19hbm9tIFt0b3BsZXZlbF90b19sZXZlbF8xYV9peCwgXQoKcGFyKG1mcm93PSBjKDEsNCksIGxhcyA9IDEpCgpwbG90Y29sIDwtIGMobWFrZVRyYW5zcGFyZW50KCdibGFjaycsIDcwKSkKb3ZlcnBsb3Rjb2wgPC0gYyhtYWtlVHJhbnNwYXJlbnQoJ3RvbWF0bzMnLCAyMDApKQoKCnlsaW0gPSByYW5nZShjU29pbF9lbnMpCm1hdHBsb3QoeWVhcnMsIHQoY1NvaWxfZW5zKSwgdHlwZSA9ICdsJywgbHR5ID0gJ3NvbGlkJyx5bGltID0geWxpbSwgY29sID0gcGxvdGNvbCwKICAgICAgICB5bGFiID0gJ0d0QycsIG1haW4gPSAnY1NvaWwnLAogICAgICAgIGJ0eSA9ICduJykKbWF0bGluZXMoIHllYXJzLCB0KChjU29pbF9lbnNbdG9wbGV2ZWxfdG9fbGV2ZWxfMWFfaXgsIF0pW2xldmVsMl9peCwgXSksY29sID0gb3ZlcnBsb3Rjb2wsICBsd2QgPSAxLjUsIGx0eSA9ICdzb2xpZCcpCgp5bGltID0gcmFuZ2UoY1NvaWxfZW5zKQptYXRwbG90KHllYXJzLCB0KGNWZWdfZW5zKSwgdHlwZSA9ICdsJywgbHR5ID0gJ3NvbGlkJyx5bGltID0geWxpbSwgY29sID0gcGxvdGNvbCwKICAgICAgICB5bGFiID0gJ0d0QycsIG1haW4gPSAnY1ZlZycsCiAgICAgICAgYnR5ID0gJ24nKQptYXRsaW5lcyggeWVhcnMsIHQoKGNWZWdfZW5zW3RvcGxldmVsX3RvX2xldmVsXzFhX2l4LCBdKVtsZXZlbDJfaXgsIF0pLCBjb2wgPSBvdmVycGxvdGNvbCwgbHdkID0gMS41LCBsdHkgPSAnc29saWQnKQoKCgp5bGltID0gcmFuZ2UoY1NvaWxfZW5zX2Fub20pCm1hdHBsb3QoeWVhcnMsIHQoY1NvaWxfZW5zX2Fub20pLCB0eXBlID0gJ2wnLCBsdHkgPSAnc29saWQnLHlsaW0gPSB5bGltLCBjb2wgPSBwbG90Y29sLAogICAgICAgIHlsYWIgPSAnR3RDJywgbWFpbiA9ICdjU29pbCBBbm9tYWx5JywKICAgICAgICBidHkgPSAnbicpCm1hdGxpbmVzKCB5ZWFycywgdCgoY1NvaWxfZW5zX2Fub21bdG9wbGV2ZWxfdG9fbGV2ZWxfMWFfaXgsIF0pW2xldmVsMl9peCwgXSksY29sID0gb3ZlcnBsb3Rjb2wsIGx3ZCA9IDEuNSwgbHR5ID0gJ3NvbGlkJykKCgp5bGltID0gcmFuZ2UoY1NvaWxfZW5zX2Fub20pCm1hdHBsb3QoeWVhcnMsIHQoY1ZlZ19lbnNfYW5vbSksIHR5cGUgPSAnbCcsIGx0eSA9ICdzb2xpZCcseWxpbSA9IHlsaW0sIGNvbCA9IHBsb3Rjb2wsCiAgICAgICAgeWxhYiA9ICdHdEMnLCBtYWluID0gJ2NWZWcgQW5vbWFseScsCiAgICAgICAgYnR5ID0gJ24nKQptYXRsaW5lcyggeWVhcnMsIHQoKGNWZWdfZW5zX2Fub21bdG9wbGV2ZWxfdG9fbGV2ZWxfMWFfaXgsIF0pW2xldmVsMl9peCwgXSksY29sID0gb3ZlcnBsb3Rjb2wsbHdkID0gMS41LCBsdHkgPSAnc29saWQnKQoKYGBgCgojIyBUb3RhbCBsYW5kIGNhcmJvbiBjaGFuZ2UKCldlIHBsb3QgdGhlIEpVTEVTIHRvdGFsIGxhbmQgY2FyYm9uIGNoYW5nZSBmcm9tIDE4NTAsIHRvZ2V0aGVyIHdpdGggIm9ic2VydmF0aW9ucyIgZnJvbSB0aGUgR2xvYmFsIENhcmJvbiBCdWRnZXQgKEZyaWVkbGlnc3RlaW4gZXQgYWwsIDIwMjApLiBUaGUgIm9ic2VydmF0aW9ucyBhcmUgdGhlIGN1bXVsYXRpdmUgc3VtIG9mIHRoZSAnbGFuZCBzaW5rJyBjb2x1bW4gb24gdGhlICJoaXN0b3JpY2FsIG9ic2VydmF0aW9ucyB0YWIgb2YgdGhlIGRhdGEgZnJvbSB0aGUgcGFwZXIuIEl0IHN0YXRlcyAiVGhlIGxhbmQgc2luayBpcyB0aGUgYXZlcmFnZSBvZiBzZXZlcmFsIGR5bmFtaWMgZ2xvYmFsIHZlZ2V0YXRpb24gbW9kZWxzIHRoYXQgcmVwcm9kdWNlIHRoZSBvYnNlcnZlZCBtZWFuIHRvdGFsIGxhbmQgc2luayBvZiB0aGUgMTk5MHMuIgoKYGBge3IgdG90YWwtbGFuZC1jYXJib24tY2hhbmdlLCBtZXNzYWdlID0gRkFMU0UsIHdhcm5pbmcgPSBGQUxTRSwgZmlnLndpZHRoID0gOCwgZmlnLmhlaWdodCA9IDh9CgpwYXIobWZyb3c9IGMoMSwyKSwgbGFzID0gMSkKCnlsaW0gPSByYW5nZSh0b3RhbF9sYW5kX2NhcmJvbl9lbnMpCm1hdHBsb3QoeWVhcnMsIHQodG90YWxfbGFuZF9jYXJib25fZW5zKSwgdHlwZSA9ICdsJywgbHR5ID0gJ3NvbGlkJyx5bGltID0geWxpbSwgY29sID0gcGxvdGNvbCwKICAgICAgICB5bGFiID0gJ0d0QycsIG1haW4gPSAnVG90YWwgbGFuZCBjYXJib24nLAogICAgICAgIGJ0eSA9ICduJykKbWF0bGluZXMoIHllYXJzLCB0KCh0b3RhbF9sYW5kX2NhcmJvbl9lbnNbdG9wbGV2ZWxfdG9fbGV2ZWxfMWFfaXgsIF0pW2xldmVsMl9peCwgXSksIGNvbCA9IG92ZXJwbG90Y29sLCBsdHkgPSAnc29saWQnLCBsd2QgPSAxLjUpCgp5bGltID0gcmFuZ2UodG90YWxfbGFuZF9jYXJib25fYW5vbSkKbWF0cGxvdCh5ZWFycywgdCh0b3RhbF9sYW5kX2NhcmJvbl9hbm9tKSwgdHlwZSA9ICdsJywgbHR5ID0gJ3NvbGlkJyx5bGltID0geWxpbSwgY29sID0gcGxvdGNvbCwKICAgICAgICB5bGFiID0gJ0d0QycsIG1haW4gPSAnVG90YWwgbGFuZCBjYXJib24gYW5vbWFseScsCiAgICAgICAgYnR5ID0gJ24nKQptYXRsaW5lcyggeWVhcnMsIHQoKHRvdGFsX2xhbmRfY2FyYm9uX2Fub21bdG9wbGV2ZWxfdG9fbGV2ZWxfMWFfaXgsIF0pW2xldmVsMl9peCwgXSksIGNvbCA9IG92ZXJwbG90Y29sLCBsdHkgPSAnc29saWQnLCBsd2QgPSAxLjUpCgojQW5vbWFsaXplIGhpc3RvcmljYWwgb2JzZXJ2YXRpb25zIHRvIDE4NTAgLSAxODcwCmhpc3RvcmljYWxfdG90YWxfbGFuZF9jYXJib25fb2JzIDwtIGN1bXN1bShoaXN0b3JpY2FsX2NhcmJvbl9idWRnZXQkYGxhbmQgc2lua2ApCmhpc3RvcmljYWxfdG90YWxfbGFuZF9jYXJib25fb2JzX2Fub20gPC0gaGlzdG9yaWNhbF90b3RhbF9sYW5kX2NhcmJvbl9vYnMgLSBoaXN0b3JpY2FsX3RvdGFsX2xhbmRfY2FyYm9uX29ic1t3aGljaChoaXN0b3JpY2FsX2NhcmJvbl9idWRnZXQkWWVhciAlaW4lIDE4NTA6MTg3MCldCgpsaW5lcyhoaXN0b3JpY2FsX2NhcmJvbl9idWRnZXQkWWVhcixoaXN0b3JpY2FsX3RvdGFsX2xhbmRfY2FyYm9uX29ic19hbm9tLCB0eXBlID0gJ2wnLGNvbCA9ICdibHVlJywgbHdkID0gMikKbGVnZW5kKCd0b3BsZWZ0JywgbGVnZW5kID0gYygnUnVsZWQgb3V0JywgJ0xldmVsMWEgY29uc3RyYWludCcsICdoaXN0b3JpY2FsJyksIGNvbCA9IGMoJ2JsYWNrJywgb3ZlcnBsb3Rjb2wsICdibHVlJyksCiAgICAgICBsd2QgPSBjKDEsMS41LDIpLCBsdHkgPSAnc29saWQnKQoKCmBgYAoKIyMjIExhbmQgY2FyYm9uIFNpbms/CgpJIHRoaW5rIHRvIG1ha2UgYSBmYWlyIGNvbXBhcmlzb24sIHdlIG1pZ2h0IG5lZWQgdG8gdGFrZSB0aGUgZGlmZiBvZiB0aGUgYW5vbWFseSAob3IganVzdCB0aGUgdGltZXNlcmllcyksIGFzIHRoZSBhYm92ZSByZXByZXNlbnRzIHRoZSB0b3RhbCBjaGFuZ2Ugc2luY2UgMTg1MCwgYW5kIEkgdGhpbmsgYWxsIHRoZSAibGFuZCBzaW5rIiBzdHVmZiBsb29rcyBhdCB0aGUgeWVhci10by15ZWFyIGNoYW5nZXMuCgpgYGB7ciB0b3RhbC1sYW5kLWNhcmJvbi1zaW5rLCB3YXJuaW5nID0gRkFMU0UsIG1lc3NhZ2UgPSBGQUxTRX0KCgpsYW5kc2lua19lbnMgPC0gbWF0cml4KE5BLCBucm93ID0gbnJvdyh0b3RhbF9sYW5kX2NhcmJvbl9lbnMpLCBuY29sID0gbmNvbCh0b3RhbF9sYW5kX2NhcmJvbl9lbnMpLTEpCgpmb3IoaSBpbiAxOm5yb3cobGFuZHNpbmtfZW5zKSl7CiAgCiAgbGFuZHNpbmtfZW5zW2ksIF0gPC0gZGlmZih0b3RhbF9sYW5kX2NhcmJvbl9lbnNbaSwgXSkKfQoKCnlsaW0gPSByYW5nZShsYW5kc2lua19lbnMpCm1hdHBsb3QoeWVhcnNbLTFdLCB0KGxhbmRzaW5rX2VucyksIHR5cGUgPSAnbCcsIGx0eSA9ICdzb2xpZCcseWxpbSA9IHlsaW0sIGNvbCA9IHBsb3Rjb2wsIHhsYWIgPSAnJywKICAgICAgICB5bGFiID0gJ0d0Qy95ZWFyJywgbWFpbiA9ICdUb3RhbCBsYW5kIGNhcmJvbiBzaW5rJywKICAgICAgICBidHkgPSAnbicpCm1hdGxpbmVzKCB5ZWFyc1stMV0sIHQoKGxhbmRzaW5rX2Vuc1t0b3BsZXZlbF90b19sZXZlbF8xYV9peCwgXSlbbGV2ZWwyX2l4LCBdKSwgY29sID0gJ3RvbWF0bzMnLCBsdHkgPSAnc29saWQnKQoKbGluZXMoaGlzdG9yaWNhbF9jYXJib25fYnVkZ2V0JFllYXIsIGhpc3RvcmljYWxfY2FyYm9uX2J1ZGdldCRgbGFuZCBzaW5rYCwgY29sID0gJ2JsdWUnLCBsd2QgPSAyLCB4bGFiID0gJycpCmxlZ2VuZCgnYm90dG9tbGVmdCcsIGxlZ2VuZCA9IGMoJ1J1bGVkIG91dCcsJ2xldmVsIDFhIGNvbnN0cmFpbmVkJywnaGlzdG9yaWNhbCcpLCBjb2wgPSBjKCdibGFjaycsJ3RvbWF0bzMnLCAnYmx1ZScgKSwgbHR5ID0nc29saWQnLAogICAgICAgbHdkID0gYygxLDEsMikpCgoKYGBgCgoKIyMjIElkZW50aWZ5IHBhcnRzIG9mIHBhcmFtZXRlciBzcGFjZSB3aGVyZSB0aGUgbGFuZCBjYXJib24gc2luayBpcyBhdCBpdHMgbWF4aW11bQpXaGF0IGRvIHRoZXNlIHBhcnRzIG9mIHBhcmFtZXRlciBzcGFjZSB0ZWxsIHVzIGFib3V0IHdoYXQgd2UgbmVlZCB0byBkbyB0byBoYXZlIHRoZSBtb2RlbCByZXByb2R1Y2UgcmVhbGl0eT8KYGBge3J9CgojIEJ1aWxkIGFuIGVtdWxhdG9yIGZvciB0b3RhbCBsYW5kIGNhcmJvbiB1cHRha2UgYXQgdGhlIGVuZCBvZiB0aGUgY2VudHVyeQoKCiMgZW5zZW1ibGUgb2YgbW9kZXJuIGxhbmRzaW5rCmxhbmRzaW5rX21vZGVybl9peCA8LSB3aGljaCh5ZWFyc1stMV0gJWluJSAxOTk0OjIwMTMpCgpsYW5kc2lua19tb2Rlcm5fZW5zIDwtIChhcHBseShsYW5kc2lua19lbnNbLCBsYW5kc2lua19tb2Rlcm5faXhdLCAxLCBtZWFuKSkKCmxhbmRzaW5rX21vZGVybl9lbnNfbGV2ZWwxYSA8LSBsYW5kc2lua19tb2Rlcm5fZW5zW3RvcGxldmVsX3RvX2xldmVsXzFhX2l4XQoKIyBvYnNlcnZhdGlvbnMgb2YgbW9kZXJuIGxhbmQgc2luawoKaGlzdF9peCA8LSB3aGljaChoaXN0b3JpY2FsX2NhcmJvbl9idWRnZXQkWWVhciAlaW4lIDE5OTQ6MjAxMykKbGFuZHNpbmtfbW9kZXJuX29icyA8LSBtZWFuKGhpc3RvcmljYWxfY2FyYm9uX2J1ZGdldCRgbGFuZCBzaW5rYFtoaXN0X2l4IF0pCgojIFRoaXMgaXMgYWxsIDQ5OSBtZW1iZXJzCmxhbmRzaW5rX21vZGVybl9lcnIgPC0gbGFuZHNpbmtfbW9kZXJuX2VucyAtIGxhbmRzaW5rX21vZGVybl9vYnMKCmxhbmRzaW5rX21vZGVybl9lcnJfbGV2ZWwxYSA8LSBsYW5kc2lua19tb2Rlcm5fZXJyW3RvcGxldmVsX3RvX2xldmVsXzFhX2l4XSMKCgoKI1tsZXZlbDJfaXgsIF0KCiMgQnVpbGQgZW11bGF0b3JzIAoKIyBJZGVudGlmeSB0aGUgcGFydHMgb2YgcGFyYW1ldGVyIHNwYWNlIHdoZXJlIHRoZSBkaWZmZXJlbmNlcyBhcmUgbG93CgoKIyBBcmUgd2UgZ2V0dGluZyBjbG9zZSBmb3IgdGhlIHJpZ2h0IHJlYXNvbnM/IFdoYXQgZWxzZSBpcyBnb2luZyB3cm9uZz8KCgoKCmBgYAoKCmBgYHtyLCBmaWcud2lkdGggPSAxMiwgZmlnLmhlaWdodCA9IDZ9CgoKcGFyKG1mcm93ID0gYyg0LDgpLCBtYXIgPSBjKDMsMiwyLDEpKQpmb3IoaSBpbiAxOmQpewogIAogIHBsb3QoWF9sZXZlbDFhWywgaV0sbGFuZHNpbmtfbW9kZXJuX2Vycl9sZXZlbDFhLCApCiAgCn0KCgpgYGAKCmBgYHtyLCByZXN1bHRzID0gJ2hpZGUnfQogIAoKZml0X2xhbmRzaW5rX2VyciA8LSBrbSh+LixkZXNpZ24gPSBYX2xldmVsMWEsIHJlc3BvbnNlID0gIGxhbmRzaW5rX21vZGVybl9lcnJfbGV2ZWwxYSkKCgpgYGAKYGBge3IsIGZpZy53aWR0aCA9IDYsIGZpZy5oZWlnaHQgPSA4fQoKcGxvdChmaXRfbGFuZHNpbmtfZXJyKQoKYGBgCgojIyMgd2hhdCBwYXJ0cyBvZiBwYXJhbWV0ZXIgc3BhY2UgYXJlIHRoZSBjbG9zZXN0PwpgYGB7cn0KCiMgVHdvIHN0cmF0ZWdpZXMgLSBwbG90IGxhbmQgc2luayBlcnJvciBhZ2FpbnN0IHBhcmFtZXRlcnMsIGFuZCBpZGVudGlmeSBiaXRzIG9mIHBhcmFtZXRlciBzcGFjZSB3aXRoIHNtYWxsZXN0IGVycm9yCgojbG93X2Vycm9yX2l4IDwtIGxhbmRzaW5rX21vZGVybl9lcnJfbGV2ZWwxYQoKCm1pbnMgPC0gYXBwbHkoWF9sZXZlbDFhLDIsRlVOID0gbWluKQptYXhlcyA8LSBhcHBseShYX2xldmVsMWEsMixGVU4gPSBtYXgpCiAgCm5zYW1wX3VuaWYgPC0gMTAwMDAwICAKWF91bmlmIDwtIHNhbXBfdW5pZihuc2FtcF91bmlmLCBtaW5zID0gbWlucywgbWF4ZXMgPSBtYXhlcykKCnByZWRfdW5pZiA8LSBwcmVkaWN0KGZpdF9sYW5kc2lua19lcnIsIG5ld2RhdGEgPSBYX3VuaWYsIHR5cGUgPSAnVUsnKQoKYGBgCgpgYGB7ciwgZmlnLndpZHRoID0gMTIsIGZpZy5oZWlnaHQgPSAxMiwgd2FybmluZz1GQUxTRSwgbWVzc2FnZSA9IEZBTFNFfQoKCnBhcihvbWEgPSBjKDAsMCwwLDMpLCBiZyA9ICd3aGl0ZScpCnBhaXJzKFhfbGV2ZWwxYSwKICAgICAgbGFiZWxzID0gMTpkLAogICAgICBnYXAgPSAwLCBsb3dlci5wYW5lbCA9IE5VTEwsIHhsaW0gPSBjKDAsMSksIHlsaW0gPSBjKDAsMSksCiAgICAgIHBhbmVsID0gY3BvaW50cywKICAgICAgej0gbGFuZHNpbmtfbW9kZXJuX2Vuc19sZXZlbDFhLAogICAgICBjb2wgPSBieXIsCiAgICAgIGNleC5sYWJlbHMgPSAxLAogICAgICBjb2wuYXhpcyA9ICd3aGl0ZScsCiAgICAgIHBjaCA9IDIwCiAgICAgICkKCiNpbWFnZS5wbG90KGxlZ2VuZC5vbmx5ID0gVFJVRSwKIyAgICAgICAgICAgemxpbSA9IGMoMCwxKSwKIyAgICAgICAgICAgY29sID0gYmx1ZXMsCiMgICAgICAgICAgIGxlZ2VuZC5hcmdzID0gbGlzdCh0ZXh0ID0gJ0RlbnNpdHkgb2YgbW9kZWwgcnVucyBtYXRjaGluZyB0aGUgY3JpdGVyaWEnLCBzaWRlID0gMywgbGluZSA9IDEpLAojICAgICAgICAgICBob3Jpem9udGFsID0gVFJVRQojKQoKIyAgbGVnZW5kKCdsZWZ0JywgbGVnZW5kID0gcGFzdGUoMTpkLCBjb2xuYW1lcyhsaHMpKSwgY2V4ID0gMC45LCBidHkgPSAnbicpCgoKYGBgCgpgYGB7ciwgbWVzc2FnZSA9IEZBTFNFLCB3YXJuaW5nID0gRkFMU0UsIGZpZy53aWR0aCA9IDEyLCBmaWcuaGVpZ2h0ID0gMTJ9CgoKWF9rZXB0IDwtIFhfdW5pZlthYnMocHJlZF91bmlmJG1lYW4pIDwgMSwgXSAKCnBhcihvbWEgPSBjKDAsMCwwLDMpLCBiZyA9ICd3aGl0ZScpCnBhaXJzKFhfa2VwdCwKICAgICAgbGFiZWxzID0gMTpkLAogICAgICBnYXAgPSAwLCBsb3dlci5wYW5lbCA9IE5VTEwsIHhsaW0gPSBjKDAsMSksIHlsaW0gPSBjKDAsMSksCiAgICAgIHBhbmVsID0gZGZ1bmNfdXAsCiAgICAgIGNleC5sYWJlbHMgPSAxLAogICAgICBjb2wuYXhpcyA9ICd3aGl0ZScsCiAgICAgIGRmdW5jLmNvbCA9IGJsdWVzKQoKaW1hZ2UucGxvdChsZWdlbmQub25seSA9IFRSVUUsCiAgICAgICAgICAgemxpbSA9IGMoMCwxKSwKICAgICAgICAgICBjb2wgPSBibHVlcywKICAgICAgICAgICBsZWdlbmQuYXJncyA9IGxpc3QodGV4dCA9ICdEZW5zaXR5IG9mIG1vZGVsIHJ1bnMgbWF0Y2hpbmcgdGhlIGNyaXRlcmlhJywgc2lkZSA9IDMsIGxpbmUgPSAxKSwKICAgICAgICAgICBob3Jpem9udGFsID0gVFJVRQopCgpsZWdlbmQoJ2xlZnQnLCBsZWdlbmQgPSBwYXN0ZSgxOmQsIGNvbG5hbWVzKGxocykpLCBjZXggPSAwLjksIGJ0eSA9ICduJykKCgoKCgpgYGAKCmBgYHtyLCBmaWcud2lkdGggPSAxMiwgZmlnLmhlaWdodCA9IDZ9CgpwYXIobWZyb3cgPSBjKDQsOCksIG1hciA9IGMoMywyLDIsMSkpCgpmb3IoaSBpbiAxOmQpewogIAogIGhpc3QoWF9rZXB0WywgaV0sIGNvbCA9ICdncmV5JywgYm9yZGVyID0gJ3doaXRlJywgCiAgICAgICAgeGxpbSA9IGMoMCwxKSwgYnJlYWtzID0gc2VxKGZyb20gPSAwLCB0byA9IDEsIGJ5ID0gMC4xKSwKICAgICAgIG1haW4gPSBjb2xuYW1lcyhYX2tlcHQpW2ldKQogIAp9CgoKYGBgCgoKCiMjIEF1Z21lbnQgdGhlIGRlc2lnbi4KVGhlIGZ1bmN0aW9uIGFkZE5yb3lEZXNpZ25Qb2ludHMgYnVpbGRzIGFuIGVtdWxhdG9yIGZvciBlYWNoIG1vZGVsIG91dHB1dCBpbiBZLiBJdCBjb21wYXJlcyB0aGUgb3V0cHV0IG9mIGVhY2ggZW11bGF0b3IgYXQgYSBudW1iZXIgb2YgY2FuZGlkYXRlIGRlc2luIHBvaW50cywgYW5kIGNob29zZXMgYSBzcGFjZS1maWxsaW5nIHNldCBvZiB0aGVtIHRoYXQgdGhhdCBhcmUgTm90IFJ1bGVkIE91dCBZZXQgKHN0YXRpc3RpY2FsbHkgY2xvc2UgdG8gdGhlIG9ic2VydmF0aW9uIGF0IFlfdGFyZ2V0KS4KCmBgYHtyLCB3YXJuaW5nPUZBTFNFLCBtZXNzYWdlPUZBTFNFLCByZXN1bHRzPSdoaWRlJ30KIyBGaW5hbCBvdXRwdXQgbmVlZHMgdG8gYmUgZXhwcmVzc2VkIGluIHRlcm1zIG9mIG9yaWdpbmFsIExIUywgdGhlbiBwdXQgYmFjayBvdXQgdG8gY29uZiBmaWxlcy4KCiMgVGhpcyBmdW5jdGlvbiBhZGRzIG4uYXVnIHBvdGVudGlhbCBkZXNpZ24gcG9pbnRzLCBhbmQgZmluZHMgdGhlaXIgaW1wbGF1c2liaWxpdHkKIyBzY29yZSBpbiBYLm5yb3kKCndhdmUxID0gYWRkTnJveURlc2lnblBvaW50cyhYID0gWF9sZXZlbDFhLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgIFkgPSBZX2NvbnN0X2xldmVsMWFfc2NhbGVkLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgIFlfdGFyZ2V0ID0gWV90YXJnZXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBuX2F1ZyA9IDUwMDAwLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1pbnNfYXVnID0gbWluc19hdWcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXhlc19hdWcgPSBtYXhlc19hdWcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJlcyA9IDMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaXNjX2xpc3Q9ZGlzY19saXN0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlzY19zZF9saXN0ID0gZGlzY19zZF9saXN0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgb2JzX3NkX2xpc3QgPSBvYnNfc2RfbGlzdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5fYXBwID0gNTAwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgbnJlcHMgPSA1MDApCmBgYAoKCgoKIyMgV3JpdGUgdGhlIGF1Z21lbnRlZCBkZXNpZ24KVGhlIGZ1bmN0aW9uIHdyaXRlX2p1bGVzX2Rlc2lnbiBoZXJlIHNpbXBseSB0YWtlcyB0aGUgcG9pbnRzIGNhbGN1bGF0ZWQgYnkgYWRkTnJveURlc2lnblBvaW50cyBhbmQgd3JpdGVzIHRoZW0gdG8gY29uZmlndXJhdGlvbiBmaWxlcy4KCmBgYHtyfQoKIyB0aGlzIG5lZWRzIHNvcnRpbmcKc291cmNlKCd+L215UnBhY2thZ2VzL2p1bGVzUi92aWduZXR0ZXMvZGVmYXVsdF9qdWxlc19wYXJhbWV0ZXJfcGVydHVyYmF0aW9ucy5SJykKCiMgRWFzaWVzdCB3YXkgdG8gZ2VuZXJhdGUgYSBkZXNpZ24gb2YgdGhlIHJpZ2h0IHNpemUgaXMgdG8gaGF2ZSBhICJmYWMiIHdoaWNoIHRha2VzCiMgdGhlIG5hbWVzIGZyb20gdGhlIHBhcmFtZXRlciBsaXN0LCBhbmQgdGhlbiBtdWx0aXBsaWVzIGV2ZXJ5dGhpbmcgYnkgMC41IG9yIDIKCnRmIDwtICdsX3ZnX3NvaWwnCiMgd2UgZG9uJ3Qgd2FudCBhbnl0aGluZyB0aGF0IGlzIFRSVUUvRkFMU0UgdG8gYmUgaW4gZmFjCmZhY19pbml0IDwtIG5hbWVzKHBhcmFtbGlzdCkKbm90X3RmX2l4IDwtIHdoaWNoKG5hbWVzKHBhcmFtbGlzdCkhPXRmKQpwYXJhbWxpc3RfdHJ1bmMgPC1wYXJhbWxpc3Rbbm90X3RmX2l4XQoKZmFjIDwtIG5hbWVzKHBhcmFtbGlzdF90cnVuYykKCm1heGZhYyA8LWxhcHBseShwYXJhbWxpc3RfdHJ1bmMsZnVuY3Rpb24oeCkgeCRtYXhbd2hpY2gubWF4KHgkbWF4KV0gLyB4JHN0YW5kYXJkW3doaWNoLm1heCh4JG1heCldKQptaW5mYWMgPC0gbGFwcGx5KHBhcmFtbGlzdF90cnVuYyxmdW5jdGlvbih4KSB4JG1pblt3aGljaC5tYXgoeCRtYXgpXSAvIHgkc3RhbmRhcmRbd2hpY2gubWF4KHgkbWF4KV0pCgoKYGBgCgoKYGBge3J9CiMgY3JlYXRlIGEgZGlyZWN0b3J5IGZvciB0aGUgY29uZmlndXJhdGlvbiBmaWxlcwpjb25mZGlyIDwtICdjb25mX2ZpbGVzX2F1Z21lbnRfSlVMRVMtRVMtMXAwJwoKZGlyLmNyZWF0ZShjb25mZGlyKQoKWF9tbSA8LSB3YXZlMSRYX21tCgojIFRoaXMgaXMgdGhlIGZ1bmN0aW9uIHRoYXQgd3JpdGVzIHRoZSBjb25maWd1cmF0aW9uIGZpbGVzLgp3cml0ZV9qdWxlc19kZXNpZ24oWF9tbSA9IFhfbW0sIHBhcmFtbGlzdD1wYXJhbWxpc3QsIG4gPSBucm93KFhfbW0pLAogICAgICAgICAgICAgICAgICAgIGZhYyA9IGZhYywgbWluZmFjID0gbWluZmFjLCBtYXhmYWMgPSBtYXhmYWMsCiAgICAgICAgICAgICAgICAgICAgdGYgPSB0ZiwKICAgICAgICAgICAgICAgICAgICBmbnByZWZpeCA9IHBhc3RlMChjb25mZGlyLCcvcGFyYW0tcGVydHVyYi1QJyksCiAgICAgICAgICAgICAgICAgICAgbGhzZm4gPSBwYXN0ZTAoY29uZmRpciwnL2xoc19leGFtcGxlLnR4dCcpLAogICAgICAgICAgICAgICAgICAgIHN0YW5mbiA9IHBhc3RlMChjb25mZGlyLCcvc3RhbnBhcm1zX2V4YW1wbGUudHh0JyksCiAgICAgICAgICAgICAgICAgICAgYWxsc3RhbmZuID0gcGFzdGUwKGNvbmZkaXIsJy9hbGxzdGFucGFybXNfZXhhbXBsZS50eHQnKSwKICAgICAgICAgICAgICAgICAgICBybiA9IDEyLAogICAgICAgICAgICAgICAgICAgIHN0YXJ0bnVtID0gNTAwKQpgYGAKCiMjIENoZWNrIHRoZSBkZXNpZ24KQ2hlY2sgdGhhdCB0aGUgYXVnbWVudGVkIGRlc2lnbiBwcm9kdWNlcyB3aGF0IHdlIGV4cGVjdC4gTmV3IGVuc2VtYmxlIG1lbWJlcnMgc2hvdWxkIGJlIHNvbWV3aGF0IGNvbnN0cmFpbmVkIHdpdGhpbiB0aGUgYm91bmRhcmllcyBvZiB0aGUgb3JpZ2luYWwgZGVzaWduLCBpZiB0aGUgY29tcGFyaXNvbiB0byBkYXRhIG9mZmVycyBhbnkgY29uc3RyYWludC4KCmBgYHtyLCBmaWcud2lkdGggPSAxNSwgZmlnLmhlaWdodCA9IDE1fQoKClhfbW0gPC0gd2F2ZTEkWF9tbQoKcGFpcnMocmJpbmQoWCwgWF9tbSksIHhsaW0gPSBjKDAsMSksIHlsaW0gPSBjKDAsMSksIGdhcCA9IDAsIGxvd2VyLnBhbmVsID0gTlVMTCwgCiAgICAgIGNvbCA9IGMocmVwKCdncmV5JywgbnJvdyhYKSksIHJlcCgncmVkJywgbnJvdyhYX21tKSkpLAogICAgICBwY2ggPSBjKHJlcCgyMSwgbnJvdyhYKSksIHJlcCgyMCwgbnJvdyhYX21tKSkpCiAgICAgICkKCnBhcih4cGQgPSBOQSkKCmxlZ2VuZCgnYm90dG9tJywKICAgICAgIGxlZ2VuZCA9IGMoJ09yaWdpbmFsIGRlc2lnbicsICdOZXcgcG9pbnRzJyksCiAgICAgICBjb2wgPSBjKCdncmV5JywgJ3JlZCcpLAogICAgICAgaW5zZXQgPSAwLjE1LAogICAgICAgY2V4ID0gMS41LAogICAgICAgcGNoID0gYygyMSwyMCkKKQoKYGBgCgoKVmlzdWFsaXNlIHRoZSBwcmVkaWN0ZWQgb3V0cHV0cyBhdCB0aGUgTlJPWSBwb2ludHMgb2YgdGhlIG9sZCBkZXNpZ24sIGFuZCB0aGUgbmV3IHN1Z2dlc3RlZCBkZXNpZ24uCmBgYHtyfQpZX21tX2xpc3QgPC0gdmVjdG9yKG1vZGUgPSdsaXN0JywgbGVuZ3RoID0gbGVuZ3RoKHdhdmUxJGZpdF9saXN0KSkKCmZvcihpIGluIDE6bGVuZ3RoKHdhdmUxJGZpdF9saXN0KSl7Cgp5X21tIDwtIHByZWRpY3Qob2JqZWN0PXdhdmUxJGZpdF9saXN0W1tpXV0sIG5ld2RhdGEgPSB3YXZlMSRYX21tLCB0eXBlID0gJ1VLJykKCllfbW1fbGlzdFtbaV1dIDwtIHlfbW0KCn0KYGBgCgojIyBWaXN1YWxpc2luZyB0aGUgZW11bGF0ZWQgb3V0cHV0cyBhdCB0aGUgcHJvcG9zZWQgbmV3IGRlc2lnbiBwb2ludHMuCgpJbnRlcmVzdGluZ2x5LCB0aGVzZSBhcmVuJ3QgcGVyZmVjdGx5IHdpdGhpbiB0aGUgb3JpZ2luYWwgaGFyZCBib3VuZGFyaWVzIHNldCBieSBBbmR5LCBldmVuIHRob3VnaCBJJ3ZlIHNldCB0aG9zZSBib3VuZGFyaWVzIHRvIGJlIHRoZSArLSA0IHN0YW5kYXJkIGRldmlhdGlvbiB0aHJlaG9sZHMgaW4gdGhlIEhpc3RvcnkgTWF0Y2guIEkgc3VnZ2VzdCB0aGlzIGlzIGJlY2F1c2UgdGhlcmUgaXMgbW9kZWwgZGlzY3JlcGFuY3ksIGFuZCB0aGF0IHRoZXJlIGlzIGNvbnNpZGVyYWJsZSB3cmlnZ2xlIHJvb20gaW5kdWNlZCBmcm9tIGVtdWxhdG9yIHVuY2VydGFpbnR5LgoKSW4gcGFydGljdWxhciwgaXQgYXBwZWFycyB0aGF0IHZlZ2V0YXRpb24gY2FyYm9uIGlzIGRpZmZpY3VsdCB0byBrZWVwIGhpZ2gsIGFuZCB0aGF0IG1hbnkgTlJPWSBwcm9wb3NlZCBtZW1iZXJzIGhhdmUgYSBmYWlybHkgbG93IHZlZ2V0YXRpb24gY2FyYm9uLiBUaGlzIG1pZ2h0IG5lZWQgYSBkaXNjcmVwYW5jeSB0ZXJtLCBvciBhZGp1c3RpbmcgaW4gc29tZSBvdGhlciB3YXkuIEl0IGNlcnRhaW5seSBuZWVkcyBleHBsb3JpbmcsIGFuZCBhIE9BQVQgcGxvdCBtaWdodCBnaXZlIGNsdWVzIGFzIHRvIHRoZSBwYXJhbWV0ZXJzIHRvIGNob29zZS4KCmBgYHtyLCBmaWcud2lkdGggPSAxMCwgZmlnLmhlaWdodCA9IDEwfQojIEhpc3RvZ3JhbSBvZiBsZXZlbCAxIGNvbnN0cmFpbnRzCmhjb2wgPSAnZGFya2dyZXknCmxjb2wgPSAnYmxhY2snCnBhcihtZnJvdyA9IGMoMiwyKSwgZmcgPSAnZGFya2dyZXknLCBsYXMgPSAxKQoKZGlzY3NkIDwtIGMoZGlzY19zZF9saXN0LCByZWN1cnNpdmUgPSBUUlVFKQoKaGlzdChZX2NvbnN0X2xldmVsMWFfc2NhbGVkWywnbmJwX2xuZF9zdW0nXSwgY29sID0gaGNvbCwgbWFpbiA9ICdOQlAnLCB4bGFiID0gJ0d0Qy95ZWFyJykKaGlzdChZX21tX2xpc3RbWzFdXSRtZWFuLCBhZGQgPSBUUlVFLCBjb2wgPSAnYmxhY2snKQpwb2x5Z29uKHggPSBjKC0xMCwgMTAwLCAxMDAsIC0xMCksIHkgPSBjKDAsIDAsIDEwMDAsIDEwMDApLAogICAgICAgIGNvbCA9IG1ha2VUcmFuc3BhcmVudCgndG9tYXRvMicpLAogICAgICAgIGJvcmRlciA9IG1ha2VUcmFuc3BhcmVudCgndG9tYXRvMicpKQpydWcoWV90YXJnZXRbMV0sIGNvbCA9ICdibGFjaycpCnJ1ZyhjKFlfdGFyZ2V0WzFdICsgMypkaXNjc2RbMV0sWV90YXJnZXRbMV0gLSAzKmRpc2NzZFsxXSkgLCBjb2wgPSAncmVkJykKCmhpc3QoWV9jb25zdF9sZXZlbDFhX3NjYWxlZFssJ25wcF9ubGltX2xuZF9zdW0nXSwgY29sID0gaGNvbCAsIG1haW4gPSAnTlBQJywgeGxhYiA9ICdHdEMveWVhcicpCmhpc3QoWV9tbV9saXN0W1syXV0kbWVhbiwgYWRkID0gVFJVRSwgY29sID0gJ2JsYWNrJykKcG9seWdvbih4ID0gYygzNSwgODAsIDgwLCAzNSksIHkgPSBjKDAsIDAsIDEwMDAsIDEwMDApLAogICAgICAgIGNvbCA9IG1ha2VUcmFuc3BhcmVudCgndG9tYXRvMicpLAogICAgICAgIGJvcmRlciA9IG1ha2VUcmFuc3BhcmVudCgndG9tYXRvMicpKQpydWcoWV90YXJnZXRbMl0sIGNvbCA9ICdibGFjaycpCnJ1ZyhjKFlfdGFyZ2V0WzJdICsgMypkaXNjc2RbMl0sWV90YXJnZXRbMl0gLSAzKmRpc2NzZFsyXSkgLCBjb2wgPSAncmVkJykKCmhpc3QoWV9jb25zdF9sZXZlbDFhX3NjYWxlZFssJ2NTb2lsX2xuZF9zdW0nXSwgY29sID0gaGNvbCwgbWFpbiA9ICdTb2lsIENhcmJvbicsIHhsYWIgPSAnR3RDJykKaGlzdChZX21tX2xpc3RbWzNdXSRtZWFuLCBhZGQgPSBUUlVFLCBjb2wgPSAnYmxhY2snKQpwb2x5Z29uKHggPSBjKDc1MCwgMzAwMCwgMzAwMCwgNzUwKSwgeSA9IGMoMCwgMCwgMTAwMCwgMTAwMCksCiAgICAgICAgY29sID0gbWFrZVRyYW5zcGFyZW50KCd0b21hdG8yJyksCiAgICAgICAgYm9yZGVyID0gbWFrZVRyYW5zcGFyZW50KCd0b21hdG8yJykpCnJ1ZyhZX3RhcmdldFszXSwgY29sID0gJ2JsYWNrJykKcnVnKGMoWV90YXJnZXRbM10gKyAzKmRpc2NzZFszXSxZX3RhcmdldFszXSAtIDMqZGlzY3NkWzNdKSAsIGNvbCA9ICdyZWQnKQoKaGlzdChZX2NvbnN0X2xldmVsMWFfc2NhbGVkWywnY1ZlZ19sbmRfc3VtJ10sIGNvbCA9IGhjb2wsIG1haW4gPSAnVmVnZXRhdGlvbiBDYXJib24nLCB4bGFiID0gJ0d0QycpCmhpc3QoWV9tbV9saXN0W1s0XV0kbWVhbiwgYWRkID0gVFJVRSwgY29sID0gJ2JsYWNrJykKcG9seWdvbih4ID0gYygzMDAsIDgwMCwgODAwLCAzMDApLCB5ID0gYygwLCAwLCAxMDAwLCAxMDAwKSwKICAgICAgICBjb2wgPSBtYWtlVHJhbnNwYXJlbnQoJ3RvbWF0bzInKSwKICAgICAgIGJvcmRlciA9ICBtYWtlVHJhbnNwYXJlbnQoJ3RvbWF0bzInKSkKcnVnKFlfdGFyZ2V0WzRdLCBjb2wgPSAnYmxhY2snKQpydWcoYyhZX3RhcmdldFs0XSArIDMqZGlzY3NkWzRdLFlfdGFyZ2V0WzRdIC0gMypkaXNjc2RbNF0pICwgY29sID0gJ3JlZCcpCiAgCmBgYAoKCkhvdyBnb29kIGFyZSB0aGUgZm91ciBlbXVsYXRvcnMgdGhhdCB3ZSd2ZSBidWlsdD8gQXJlIHRoZXJlIGJpYXNlcz8gKHRoZXJlJ3Mgbm8gcmVhbCBldmlkZW5jZSBvZiB0aGlzKQpgYGB7ciwgZmlnLndpZHRoID0gOCwgZmlnLmhlaWdodCA9IDh9CgpwYXIobWZyb3cgPSBjKDIsMikpCgpmb3IoaSBpbiAxOjQpewogIApoaXN0KHdhdmUxJHByZWRfbGlzdFtbaV1dJG1lYW4sIG1haW4gPSBjb2xuYW1lcyhZX2NvbnN0X2xldmVsMWFfc2NhbGVkKVtpXSkKICAKfQoKCmBgYAoKIyMgT25lLWF0LWEtdGltZSBzZW5zaXRpdml0eSBhbmFseXNpcyBmb3IgdW5kZXJzdGFuZGluZyBtb2RlbCByZXNwb25zZQpJdCdzIG9idmlvdXNseSBoYXJkIHRvIG1haW50YWluIGEgaGlnaCB2ZWdldGF0aW9uIGNhcmJvbiBpbiBwYXJ0aWN1bGFyLiBXaGF0IHBhcmFtZXRlciB2YWx1ZXMgbWlnaHQgeW91IGNob29zZSB0byBkbyB0aGlzLCBhbmQgd2hhdCBtaWdodCBiZSB0aGUgdHJhZGUtb2ZmcyB5b3UgaGF2ZSB0byBtYWtlPwoKCmBgYHtyfQoKWF9vYWF0X2xldmVsMWEgPC0gb2FhdF9kZXNpZ24oWF9sZXZlbDFhLCBuPTIxLCBtZWQgPSBUUlVFKQpjb2xuYW1lcyhYX29hYXRfbGV2ZWwxYSkgPSBjb2xuYW1lcyhYKQoKeV9vYWF0IDwtIHByZWRpY3Qua20od2F2ZTEkZml0X2xpc3RbWzRdXSwgbmV3ZGF0YSA9IFhfb2FhdF9sZXZlbDFhLCB0eXBlID0gJ1VLJykKCmBgYAoKCgoKRmlyc3QsIHdoYXQgcGFyYW1ldGVycyBhZmZlY3QgdmVnZXRhdGlvbiBjYXJib24gYW5kIGhvdz8gSG93IHN1cmUgYXJlIHdlIGFib3V0IHRoYXQ/CgpgYGB7ciwgZmlnLndpZHRoID0gOCwgZmlnLmhlaWdodCA9IDEwfQoKCm9hYXRMaW5lUGxvdChYX29hYXQgPSBYX29hYXRfbGV2ZWwxYSwgeV9vYWF0X21lYW4gPSB5X29hYXQkbWVhbiwgeV9vYWF0X3NkID0geV9vYWF0JHNkLCAKICAgICAgICAgICAgIG5fb2FhdCA9IDIxLG5yID0gNiwgbmMgPSA2KSAKCgpgYGAKCgoKYGBge3J9CgpZX29hYXRfY29uc3RfbGV2ZWwxYV9zY2FsZWQgPC0gbWF0cml4KG5jb2wgPSBuY29sKFlfY29uc3RfbGV2ZWwxYV9zY2FsZWQpLCBucm93ID0gbnJvdyhYX29hYXRfbGV2ZWwxYSkpCgpmb3IoaSBpbiAxOm5jb2woWV9jb25zdF9sZXZlbDFhX3NjYWxlZCkpewoKICB5X29hYXQgPC0gcHJlZGljdC5rbSh3YXZlMSRmaXRfbGlzdFtbaV1dLCBuZXdkYXRhID0gWF9vYWF0X2xldmVsMWEsIHR5cGUgPSAnVUsnKQogIFlfb2FhdF9jb25zdF9sZXZlbDFhX3NjYWxlZFssaV0gPC0geV9vYWF0JG1lYW4KfQoKYGBgCgoKV2hhdCBtaWdodCBiZSB0aGUgdHJhZGUtb2ZmcyBmb3IgYSBoaWdoIChvciBhY2N1cmF0ZSkgdmVnZXRhdGlvbiBjYXJib24/IGFyZSB0aGV5IGFjY2VwdGFibGU/IFBsb3QgdGhlIG9hYXQgc2Vuc2l0aXZpdHkgb2YgdGhlIG90aGVyIDMgb3V0cHV0cyB3ZSdyZSBjYWxpYnJhdGluZyBvbi4gCgpgYGB7ciwgZmlnLndpZHRoPTEwLCBmaWcuaGVpZ2h0ID0gMTB9Cllfb2FhdF9jb25zdF9sZXZlbDFhX3NjYWxlZF9ub3JtIDwtIG5vcm1hbGl6ZShZX29hYXRfY29uc3RfbGV2ZWwxYV9zY2FsZWQpCgpvYWF0TGluZVBsb3RNdWx0aShYX29hYXQgPSBYX29hYXRfbGV2ZWwxYSwgWV9vYWF0ID0gWV9vYWF0X2NvbnN0X2xldmVsMWFfc2NhbGVkX25vcm0gLCAgbl9vYWF0ID0gMjEsIG5yID0gNiwgbmMgPSA2LAogICAgICAgICAgICAgICAgICBsd2QgPSAyKQoKcmVzZXQoKQpsZWdlbmQoJ3RvcCcsIGMoJ25icCcsICducHAnLCAnY3NvaWwnLCAnY3ZlZycpLCBjb2wgPSBjKDEsMiwzLDQpLCBsdHkgPSAnc29saWQnLCBsd2QgPSAyLCBob3JpeiA9IFRSVUUpCgoKYGBgCgoKV2hhdCBkbyB0aGUgZW11bGF0b3JzIG1ha2Ugb2YgdGhlIGRlc2lnbiBwb2ludHMgd2hpY2ggYWN0dWFsbHkgbWFrZSBBbmR5J3MgImhhcmQgYm91bmRhcnkiIGNyaXRlcmlhPwpJZiB3ZSBsZWF2ZSB0aGVtIG91dCwgZG8gdGhleSBzdGlsbCBwbGFjZSB0aGUgb3V0cHV0IHdpdGhpbiB0aGUgaGFyZCBib3VuZGFyaWVzPwoKYGBge3J9Cgphd19ib3VuZGFyeV9peCA9IHdoaWNoKFlfY29uc3RfbGV2ZWwxYV9zY2FsZWRbLCduYnBfbG5kX3N1bSddID4gLTEwICYKICAgICAgICAgICAgICAgICAgICBZX2NvbnN0X2xldmVsMWFfc2NhbGVkWywnbnBwX25saW1fbG5kX3N1bSddID4gMzUgJiAgWV9jb25zdF9sZXZlbDFhX3NjYWxlZFssJ25wcF9ubGltX2xuZF9zdW0nXSA8IDgwICYKICAgICAgICAgICAgICAgICAgICBZX2NvbnN0X2xldmVsMWFfc2NhbGVkWywnY1NvaWxfbG5kX3N1bSddID4gNzUwICYgWV9jb25zdF9sZXZlbDFhX3NjYWxlZFssJ2NTb2lsX2xuZF9zdW0nXSA8IDMwMDAgJgogICAgICAgICAgICAgICAgICBZX2NvbnN0X2xldmVsMWFfc2NhbGVkWywnY1ZlZ19sbmRfc3VtJ10gPiAzMDAgJiBZX2NvbnN0X2xldmVsMWFfc2NhbGVkWywnY1ZlZ19sbmRfc3VtJ10gPCA4MDAKICApCgoKClhfYXdfYm91bmRhcnkgPSBYX2xldmVsMWFbYXdfYm91bmRhcnlfaXgsIF0KWV9hd19ib3VuZGFyeSA9IFlfY29uc3RfbGV2ZWwxYV9zY2FsZWRbYXdfYm91bmRhcnlfaXgsIF0KCmBgYAoKIyMgQ2hlY2sgdGhlIGVtdWxhdG9ycyB0aGF0IHByb2R1Y2UgdGhlIG5ldyBkZXNpZ24KRG8gYSBsZWF2ZS1vbmUtb3V0IGNyb3NzIHZhbGlkYXRpb24gb2YgcG9pbnRzIGluc2lkZSB0aGUgaGFyZCBib3VuZGFyaWVzIHVzaW5nIHRoZSB3YXZlMSBmaXRzLgpgYGB7cn0KIyBxdWlja2VzdCB0byBmaW5kIHRoZSBsb28gcHJlZGljdGlvbnMgYXQgdGhlIHJpZ2h0IGluZGljZXMKCgpgYGAKCmBgYHtyfQoKbG9vX21lYW5fWV9sZXZlbDFhIDwtIG1hdHJpeChucm93ID0gbnJvdyhYX2xldmVsMWEpLCBuY29sID0gbmNvbChZX2NvbnN0X2xldmVsMWFfc2NhbGVkKSkKbG9vX3NkX1lfbGV2ZWwxYSA8LSBtYXRyaXgobnJvdyA9IG5yb3coWF9sZXZlbDFhKSwgbmNvbCA9IG5jb2woWV9jb25zdF9sZXZlbDFhX3NjYWxlZCkpCiAgCiAgZm9yKGkgaW4gMTpuY29sKFlfY29uc3RfbGV2ZWwxYV9zY2FsZWQpKXsKCmxvbyA8LSBsZWF2ZU9uZU91dC5rbSh3YXZlMSRmaXRfbGlzdFtbaV1dLHR5cGUgPSAnVUsnLCB0cmVuZC5yZWVzdGltID0gVFJVRSApCiAgbG9vX21lYW5fWV9sZXZlbDFhWyxpXSA8LSBsb28kbWVhbgogIGxvb19zZF9ZX2xldmVsMWFbLGldIDwtIGxvbyRzZAp9CgpgYGAKCldlIHNlZSBpbiB0aGUgbGVhdmUtb25lLW91dCBhbmFseXNpcyB0aGF0IHRoZSBlbXVsYXRvciBpcyBjb25zaXN0ZW50bHkgdW5kZXItcHJlZGljdGluZyB0aGUgdmVnZXRhdGlvbiBjYXJib24gKHRob3VnaCB0aGUgdW5jZXJ0YWludHkgZXN0aW1hdGUgb2Z0ZW4gY292ZXJzIHRoZSBhY3R1YWwgdmFsdWUpLlRoaXMgc3VnZ2VzdHMgKDEpIHRoYXQgdGhlcmUgaXNuJ3QgcmVhbGx5IGEgaHVnZSBwcm9ibGVtIHdpdGggYSBtb2RlbCBkaXNjcmVwYW5jeSAob3IgYXQgbGVhc3QgdGhhdCBpc24ndCB0aGUgb25seSBwcm9ibGVtKSwgYW5kICgyKSB0aGUgaGlzdG9yeSBtYXRjaGluZyBpcyB3b3JraW5nIGFzIGl0IHNob3VsZCwgYW5kIHRha2luZyBpbnRvIGFjY291bnQgYSBub3QtZ3JlYXQgZW11bGF0b3IuCgpgYGB7ciwgZmlnLndpZHRoID0gOCwgZmlnLmhlaWdodCA9IDh9CgpwYXIobWZyb3cgPSBjKDIsMikpCgpmb3IoaSBpbiAxOm5jb2wobG9vX21lYW5fWV9sZXZlbDFhKSl7CiAgCiAgcm4gPC0gcmFuZ2UoYyhsb29fbWVhbl9ZX2xldmVsMWFbYXdfYm91bmRhcnlfaXgsaV0gLSAoMipsb29fc2RfWV9sZXZlbDFhW2F3X2JvdW5kYXJ5X2l4LGldKSAsIGxvb19tZWFuX1lfbGV2ZWwxYVthd19ib3VuZGFyeV9peCxpXSArICgyKmxvb19zZF9ZX2xldmVsMWFbYXdfYm91bmRhcnlfaXgsaV0pICkpCiAgCiAgCiAgCiAgcGxvdChZX2NvbnN0X2xldmVsMWFfc2NhbGVkW2F3X2JvdW5kYXJ5X2l4LCBpXSwgbG9vX21lYW5fWV9sZXZlbDFhW2F3X2JvdW5kYXJ5X2l4LGldLCB5bGltID0gcm4sIG1haW4gPSBjb2xuYW1lcyhZX2NvbnN0X2xldmVsMWFfc2NhbGVkKVtpXSwgeGxhYiA9ICdhY3R1YWwnLCB5bGFiID0gJ3ByZWRpY3RlZCcpCiAgCiAgc2VnbWVudHMoeDAgPSBZX2NvbnN0X2xldmVsMWFfc2NhbGVkW2F3X2JvdW5kYXJ5X2l4LCBpXSwgeTAgPSBsb29fbWVhbl9ZX2xldmVsMWFbYXdfYm91bmRhcnlfaXgsaV0gLSAoMipsb29fc2RfWV9sZXZlbDFhW2F3X2JvdW5kYXJ5X2l4LGldKSAgLCB4MSA9IFlfY29uc3RfbGV2ZWwxYV9zY2FsZWRbYXdfYm91bmRhcnlfaXgsIGldICwgeTEgPSBsb29fbWVhbl9ZX2xldmVsMWFbYXdfYm91bmRhcnlfaXgsaV0gKyAoMipsb29fc2RfWV9sZXZlbDFhW2F3X2JvdW5kYXJ5X2l4LGldKSAsIGNvbCA9IG1ha2VUcmFuc3BhcmVudCgnYmxhY2snLCA3MCkpCiAgYWJsaW5lKDAsMSkKICAKfQoKCmBgYAoKIyMgQ29tcGFyZSB0aGUgc3RyYWlnaHQga20gd2l0aCBhIHR3by1zdGVwIGVtdWxhdG9yCklzIGEgdHdvLXN0ZXAgZW11bGF0b3IgYW55IGJldHRlciBhdCBlbXVsYXRpbmcgdGhvc2UgY3J1Y2lhbCBwb2ludHMgd2hpY2ggZmFsbCB3aXRoaW4gYXcncyBoYXJkIGJvdW5kYXJpZXM/IEZpcnN0LCBjcmVhdGUgYSBsaXN0IG9mIGVtdWxhdG9yIGZpdHMuCgpgYGB7cn0KCmZpdGxpc3RfWV9jb25zdF9sZXZlbDFhX3NjYWxlZCA8LSB2ZWN0b3IobW9kZSA9ICdsaXN0JywgbGVuZ3RoID0gbmNvbChZX2NvbnN0X2xldmVsMWFfc2NhbGVkKSkKCmZvcihpIGluIDE6bmNvbChZX2NvbnN0X2xldmVsMWFfc2NhbGVkKSl7CiAgCiAgeSA8LSBZX2NvbnN0X2xldmVsMWFfc2NhbGVkWyxpXQogIGZpdCA8LSB0d29TdGVwX2dsbW5ldChYID0gWF9sZXZlbDFhLCB5KQogIGZpdGxpc3RfWV9jb25zdF9sZXZlbDFhX3NjYWxlZFtbaV1dIDwtIGZpdAoKfQoKCmBgYAoKYGBge3J9Cmxvb19tZWFuX2dsbW5ldF9ZX2xldmVsMWEgPC0gbWF0cml4KG5yb3cgPSBucm93KFhfbGV2ZWwxYSksIG5jb2wgPSBuY29sKFlfY29uc3RfbGV2ZWwxYV9zY2FsZWQpKQpsb29fc2RfZ2xtbmV0X1lfbGV2ZWwxYSA8LSBtYXRyaXgobnJvdyA9IG5yb3coWF9sZXZlbDFhKSwgbmNvbCA9IG5jb2woWV9jb25zdF9sZXZlbDFhX3NjYWxlZCkpCiAgCiAgZm9yKGkgaW4gMTpuY29sKFlfY29uc3RfbGV2ZWwxYV9zY2FsZWQpKXsKCmxvbyA8LSBsZWF2ZU9uZU91dC5rbShmaXRsaXN0X1lfY29uc3RfbGV2ZWwxYV9zY2FsZWRbW2ldXSRlbXVsYXRvcix0eXBlID0gJ1VLJywgdHJlbmQucmVlc3RpbSA9IFRSVUUgKQogIGxvb19tZWFuX2dsbW5ldF9ZX2xldmVsMWFbLGldIDwtIGxvbyRtZWFuCiAgbG9vX3NkX2dsbW5ldF9ZX2xldmVsMWFbLGldIDwtIGxvbyRzZAp9CgpgYGAKCkl0IGRvZXNuJ3QgYXBwZWFyIHRoYXQgdGhlIHR3by1zdGVwIGVtdWxhdG9yIChoZXJlIHBsb3R0ZWQgaW4gcmVkKSBpcyBkb2luZyBhbnkgYmV0dGVyIHRoYW4gdGhlIHJlZ3VsYXIgZW11bGF0b3IuCmBgYHtyLCBmaWcud2lkdGggPSA4LCBmaWcuaGVpZ2h0ID0gOH0KcGFyKG1mcm93ID0gYygyLDIpKQoKZm9yKGkgaW4gMTpuY29sKGxvb19tZWFuX1lfbGV2ZWwxYSkpewogIAogIHJuIDwtIHJhbmdlKGMobG9vX21lYW5fWV9sZXZlbDFhW2F3X2JvdW5kYXJ5X2l4LGldIC0gKDIqbG9vX3NkX1lfbGV2ZWwxYVthd19ib3VuZGFyeV9peCxpXSkgLCBsb29fbWVhbl9ZX2xldmVsMWFbYXdfYm91bmRhcnlfaXgsaV0gKyAoMipsb29fc2RfWV9sZXZlbDFhW2F3X2JvdW5kYXJ5X2l4LGldKSApKQogIAogIAogIAogIHBsb3QoWV9jb25zdF9sZXZlbDFhX3NjYWxlZFthd19ib3VuZGFyeV9peCwgaV0sIGxvb19tZWFuX1lfbGV2ZWwxYVthd19ib3VuZGFyeV9peCxpXSwgeWxpbSA9IHJuLCBtYWluID0gY29sbmFtZXMoWV9jb25zdF9sZXZlbDFhX3NjYWxlZClbaV0sIHhsYWIgPSAnYWN0dWFsJywgeWxhYiA9ICdwcmVkaWN0ZWQnKQogIAogIHBvaW50cyhZX2NvbnN0X2xldmVsMWFfc2NhbGVkW2F3X2JvdW5kYXJ5X2l4LCBpXSwgbG9vX21lYW5fZ2xtbmV0X1lfbGV2ZWwxYVthd19ib3VuZGFyeV9peCxpXSwgY29sID0gJ3JlZCcpCiAgCiAgCiAgc2VnbWVudHMoeDAgPSBZX2NvbnN0X2xldmVsMWFfc2NhbGVkW2F3X2JvdW5kYXJ5X2l4LCBpXSwgeTAgPSBsb29fbWVhbl9ZX2xldmVsMWFbYXdfYm91bmRhcnlfaXgsaV0gLSAoMipsb29fc2RfWV9sZXZlbDFhW2F3X2JvdW5kYXJ5X2l4LGldKSAgLCB4MSA9IFlfY29uc3RfbGV2ZWwxYV9zY2FsZWRbYXdfYm91bmRhcnlfaXgsIGldICwgeTEgPSBsb29fbWVhbl9ZX2xldmVsMWFbYXdfYm91bmRhcnlfaXgsaV0gKyAoMipsb29fc2RfWV9sZXZlbDFhW2F3X2JvdW5kYXJ5X2l4LGldKSAsIGNvbCA9IG1ha2VUcmFuc3BhcmVudCgnYmxhY2snLCA3MCkpCiAgYWJsaW5lKDAsMSkKICAKfQpgYGAKClR3byBvdGhlciB0aGluZ3MgSSBjYW4gdGhpbmsgb2YgdG8gY2hlY2s6IDEpIGhvdyBhYm91dCB1c2luZyAibXVsdGlzdGFydCIgdG8gY2hvb3NlIGRpZmZlcmVudCBzdGFydGluZyBjb25kaXRpb25zIGZvciBvcHRpbWlzaW5nIHRoZSBlbXVsYXRvcnMgYW5kIDIpIFVzaW5nIGEgZmxhdCBwcmlvciBmb3IgdGhlIG1lYW4gZnVuY3Rpb24gcmF0aGVyIHRoYW4gYSBsaW5lYXIgcHJpb3IuCmBgYHtyfQoKZml0bGlzdF9mbGF0cHJpb3JfWV9jb25zdF9sZXZlbDFhX3NjYWxlZCA8LSB2ZWN0b3IobW9kZSA9ICdsaXN0JywgbGVuZ3RoID0gbmNvbChZX2NvbnN0X2xldmVsMWFfc2NhbGVkKSkKCmZvcihpIGluIDE6bmNvbChZX2NvbnN0X2xldmVsMWFfc2NhbGVkKSl7CiAgCiAgeSA8LSBZX2NvbnN0X2xldmVsMWFfc2NhbGVkWyxpXQogIGZpdCA8LSBrbShmb3JtdWxhID1+MSwgZGVzaWduID0gWF9sZXZlbDFhLCByZXNwb25zZSA9IHkpCiAgZml0bGlzdF9mbGF0cHJpb3JfWV9jb25zdF9sZXZlbDFhX3NjYWxlZFtbaV1dIDwtIGZpdAoKfQoKCmBgYAoKYGBge3J9Cmxvb19tZWFuX2ZsYXRwcmlvcl9ZX2xldmVsMWEgPC0gbWF0cml4KG5yb3cgPSBucm93KFhfbGV2ZWwxYSksIG5jb2wgPSBuY29sKFlfY29uc3RfbGV2ZWwxYV9zY2FsZWQpKQpsb29fc2RfZmxhdHByaW9yX1lfbGV2ZWwxYSA8LSBtYXRyaXgobnJvdyA9IG5yb3coWF9sZXZlbDFhKSwgbmNvbCA9IG5jb2woWV9jb25zdF9sZXZlbDFhX3NjYWxlZCkpCiAgCiAgZm9yKGkgaW4gMTpuY29sKFlfY29uc3RfbGV2ZWwxYV9zY2FsZWQpKXsKCmxvbyA8LSBsZWF2ZU9uZU91dC5rbShmaXRsaXN0X2ZsYXRwcmlvcl9ZX2NvbnN0X2xldmVsMWFfc2NhbGVkW1tpXV0sdHlwZSA9ICdVSycsIHRyZW5kLnJlZXN0aW0gPSBUUlVFICkKICBsb29fbWVhbl9mbGF0cHJpb3JfWV9sZXZlbDFhWyxpXSA8LSBsb28kbWVhbgogIGxvb19zZF9mbGF0cHJpb3JfWV9sZXZlbDFhWyxpXSA8LSBsb28kc2QKfQoKYGBgCgpgYGB7ciwgZmlnLndpZHRoID0gOCwgZmlnLmhlaWdodCA9IDh9CnBhcihtZnJvdyA9IGMoMiwyKSkKCmZvcihpIGluIDE6bmNvbChsb29fbWVhbl9ZX2xldmVsMWEpKXsKICAKICBybiA8LSByYW5nZShjKGxvb19tZWFuX1lfbGV2ZWwxYVthd19ib3VuZGFyeV9peCxpXSAtICgyKmxvb19zZF9ZX2xldmVsMWFbYXdfYm91bmRhcnlfaXgsaV0pICwgbG9vX21lYW5fWV9sZXZlbDFhW2F3X2JvdW5kYXJ5X2l4LGldICsgKDIqbG9vX3NkX1lfbGV2ZWwxYVthd19ib3VuZGFyeV9peCxpXSkgKSkKICAKICAKICAKICBwbG90KFlfY29uc3RfbGV2ZWwxYV9zY2FsZWRbYXdfYm91bmRhcnlfaXgsIGldLCBsb29fbWVhbl9ZX2xldmVsMWFbYXdfYm91bmRhcnlfaXgsaV0sIHlsaW0gPSBybiwgbWFpbiA9IGNvbG5hbWVzKFlfY29uc3RfbGV2ZWwxYV9zY2FsZWQpW2ldLCB4bGFiID0gJ2FjdHVhbCcsIHlsYWIgPSAncHJlZGljdGVkJykKICAKICBwb2ludHMoWV9jb25zdF9sZXZlbDFhX3NjYWxlZFthd19ib3VuZGFyeV9peCwgaV0sIGxvb19tZWFuX2ZsYXRwcmlvcl9ZX2xldmVsMWFbYXdfYm91bmRhcnlfaXgsaV0sIGNvbCA9ICdyZWQnKQogIAogIAogIHNlZ21lbnRzKHgwID0gWV9jb25zdF9sZXZlbDFhX3NjYWxlZFthd19ib3VuZGFyeV9peCwgaV0sIHkwID0gbG9vX21lYW5fWV9sZXZlbDFhW2F3X2JvdW5kYXJ5X2l4LGldIC0gKDIqbG9vX3NkX1lfbGV2ZWwxYVthd19ib3VuZGFyeV9peCxpXSkgICwgeDEgPSBZX2NvbnN0X2xldmVsMWFfc2NhbGVkW2F3X2JvdW5kYXJ5X2l4LCBpXSAsIHkxID0gbG9vX21lYW5fZmxhdHByaW9yX1lfbGV2ZWwxYVthd19ib3VuZGFyeV9peCxpXSArICgyKmxvb19zZF9mbGF0cHJpb3JfWV9sZXZlbDFhW2F3X2JvdW5kYXJ5X2l4LGldKSAsIGNvbCA9IG1ha2VUcmFuc3BhcmVudCgnYmxhY2snLCA3MCkpCiAgYWJsaW5lKDAsMSkKICAKfQoKCgpgYGAKCgoKIyBFeHBsb3JpbmcgbmV3IGNvbnN0cmFpbnRzCklucHV0IGZyb20gRWRkeSBSb2JlcnRzb246CgoiV2UgY2FuIGFzc3VtZSB0aGF0IHRoZSBtYWpvcml0eSBvZiB2ZWdldGF0aW9uIGNhcmJvbiBpcyBzdG9yZWQgaW4gdHJlZSB0cnVua3Mgc28sIHRoZSBjYXJib24gZGVuc2l0eSBvZiB0cmVlcyBpcyBhcHByb3hpbWF0ZWx5IChjVmVnX2xuZF9tZWFuIC8gdHJlZUZyYWNfbG5kX21lYW4pLiBBbHRob3VnaCBJIHN1cHBvc2UgaXQncyBwb3NzaWJsZSB0aGF0IGluIHRoZSBQUEUgdGhlIHNocnVicyBoYXZlIGJlY29tZSB0cmVlLWxpa2UsIHNvIGl0IG1pZ2h0IGJlIGludGVyZXN0aW5nIHRvIHBsb3QgY1ZlZ19sbmRfbWVhbiB2ZXJzdXMgIChzaHJ1YkZyYWNfbG5kX21lYW4gKyB0cmVlRnJhY19sbmRfbWVhbikgYXMgd2VsbC4gVGhlIGZpcnN0IHF1ZXN0aW9uIGlzIHdoZXRoZXIgY1ZlZ19sbmRfbWVhbiBpbmNyZWFzZXMgbGluZWFybHkgd2l0aCB0cmVlRnJhY19sbmRfbWVhbi4gVGhlbiBpZiB0aGlzIHR1cm5lZCBvdXQgdG8gYmUgaW50ZXJlc3RpbmcsIHdlIGNvdWxkIHByb2R1Y2UgYSB0cmVlQ1ZlZ19sbmRfbWVhbiBvdXRwdXQuIgoKYGBge3IsIGZpZy53aWR0aCA9IDcsIGZpZy5oZWlnaHQgPSA3fQoKI3BkZihmaWxlID0gJ3ZlZ0NfZGVuc2l0eS5wZGYnLCB3aWR0aCA9IDYsIGhlaWdodCA9IDYpCnBsb3QoWV9sZXZlbDBbLCd0cmVlRnJhY19sbmRfbWVhbiddLFlfbGV2ZWwwWywnY1ZlZ19sbmRfbWVhbiddLCBtYWluID0gIlZlZ2V0YXRpb24gKHRyZWUpIGNhcmJvbiBkZW5zaXR5LCBMZXZlbDAiLAogICAgIHhsYWIgPSAndHJlZUZyYWNfbG5kX21lYW4nLCB5bGFiICA9ICdjVmVnX2xuZF9tZWFuJyApCgojZGV2Lm9mZigpCgpgYGAKCklzIHRoZSByYW5nZSBvZiBjYXJib24gZGVuc2l0aWVzIG5hcnJvd2VyIGluIHRoZSAiaGFyZCBib3VuZGFyeSIgc2V0PwpgYGB7ciwgZmlnLndpZHRoID0gNiwgZmlnLmhlaWdodCA9IDZ9CgpZX2xldmVsMWFfYXcgPC0gWV9sZXZlbDFhW2F3X2JvdW5kYXJ5X2l4LCBdClhfbGV2ZWwxYV9hdyA8LSBYX2xldmVsMWFbYXdfYm91bmRhcnlfaXgsIF0KCiNwZGYoZmlsZSA9ICd2ZWdDX2RlbnNpdHlfYXcucGRmJywgd2lkdGggPSA2LCBoZWlnaHQgPSA2KQpwbG90KFlfbGV2ZWwxYVssJ3RyZWVGcmFjX2xuZF9tZWFuJ10sWV9sZXZlbDFhWywnY1ZlZ19sbmRfbWVhbiddLCBtYWluID0gIlZlZ2V0YXRpb24gKHRyZWUpIGNhcmJvbiBkZW5zaXR5IiwKICAgICB4bGFiID0gJ3RyZWVGcmFjX2xuZF9tZWFuJywgeWxhYiAgPSAnY1ZlZ19sbmRfbWVhbicgKQoKcG9pbnRzKCBZX2xldmVsMWFfYXdbLCd0cmVlRnJhY19sbmRfbWVhbiddLFlfbGV2ZWwxYV9hd1ssJ2NWZWdfbG5kX21lYW4nXSwgcGNoID0gMTksIGNvbCA9ICdyZWQnKQpsZWdlbmQoJ3RvcGxlZnQnLCBsZWdlbmQgPSBjKCdMZXZlbDFhJywnQVcgY29uc3RyYWludHMnKSwgcGNoID0gYygyMSwgMTkpLCBjb2wgPSBjKCdibGFjaycsICdyZWQnKSkKIyAgIGRldi5vZmYoKQoKCgpgYGAKCgoKCmBgYHtyfQpjX2RlbnNpdHkgPC0gWV9sZXZlbDFhWywndHJlZUZyYWNfbG5kX21lYW4nXSAvIFlfbGV2ZWwxYVssJ2NWZWdfbG5kX21lYW4nXQoKaGlzdChjX2RlbnNpdHkpCgoKCmBgYAoKIyMgTm93IHRoYXQgd2UgaGF2ZSBjb25zdHJhaW50cywgd2UgY2FuIGV4cGxvcmUgdGhlaXIgZWZmZWN0IG9uIHRoZSBvdXRwdXQgCgpgYGB7ciwgZmlnLndpZHRoID0gMjAsIGZpZy5oZWlnaHQgPSAyMH0KIyBQYWlycyBwbG90IG9mIG91dHB1dAp5X25hbWVzX21lYW4gPC0gYygnbmJwX2xuZF9tZWFuJywgJ2ZMdWNfbG5kX21lYW4nLCAnbnBwX25saW1fbG5kX21lYW4nLCAnY1NvaWxfbG5kX21lYW4nLAogICAgICAgICAgICAnY1ZlZ19sbmRfbWVhbicsICdsYW5kQ292ZXJGcmFjX2xuZF9tZWFuJywgJ2ZIYXJ2ZXN0X2xuZF9tZWFuJywKICAgICAgICAgICAgJ2xhaV9sbmRfbWVhbicsICdyaF9sbmRfbWVhbicsICd0cmVlRnJhY19sbmRfbWVhbicsICdjM1BmdEZyYWNfbG5kX21lYW4nLCAKICAgICAgICAgICAgJ2M0UGZ0RnJhY19sbmRfbWVhbicsICdzaHJ1YkZyYWNfbG5kX21lYW4nLCAnYmFyZXNvaWxGcmFjX2xuZF9tZWFuJykKCllfbGV2ZWwxYV9tZWFuIDwtIFlfbGV2ZWwxYVsseV9uYW1lc19tZWFuXQoKcGNvbCA8LSByZXAoJ2JsYWNrJywgbnJvdyhZX2xldmVsMWFfbWVhbikpCnBjb2xbYXdfYm91bmRhcnlfaXhdIDwtICdyZWQnCnBhaXJzKFlfbGV2ZWwxYV9tZWFuLCBjb2wgPSBwY29sLCBsb3dlci5wYW5lbCA9IE5VTEwsIHBjaCA9IDE5LCBjZXgubGFiZWxzID0gMS41KQoKCgoKYGBgCgojIyBIb3cgbXVjaCBkb2VzIGNvbnN0cmFpbmluZyBhbiBvdXRwdXQgY29uc3RyYWluIG90aGVyIG91dHB1dHM/CkZvciBleGFtcGxlLCB3aGF0IGVmZmVjdCBoYXMgdGhlIEFXICJoYXJkIGJvdW5kYXJ5IiBjb25zdHJhaW50IHByb2R1Y2VkIG9uIHJhbmdlcyBvZiB0aGUgb3RoZXIgKG1hcmdpbmFsKSBvdXRwdXRzPyBXaGljaCBjb25zdHJhaW50IGlzIGRvaW5nIHRoZSBtYWpvcml0eSBvZiB0aGUgd29yaz8KCgpBIGZ1bmN0aW9uIHRvIGZpbmQgdGhlIHByb3BvcnRpb24gb2Ygb3V0cHV0IHNwYWNlIHRoYXQgaXMgcmVtb3ZlZCAob3IgcmV0YWluZWQpIHdoZW4gYXBwbHlpbmcgYSBjb25zdHJhaW50LgpgYGB7cn0KCmNvbnN0cmFpbnRfcHJvcCA8LSBmdW5jdGlvbihZLCBjb25zdHJhaW50X2l4KXsKICAKICBZY29uc3QgPC0gWVtjb25zdHJhaW50X2l4LCBdCiAgWWNvbnN0X25vcm0gPC0gbm9ybWFsaXplKFljb25zdCwgd3J0ID0gWSkKICBybiA8LSBhcHBseShZY29uc3Rfbm9ybSwgMiwgcmFuZ2UpCiAgb3V0IDwtIHJuCiAgb3V0CiAgCn0KCgpgYGAKCmBgYHtyfQpZX2NvbnN0cmFpbnRfcGxvdCA8LSBmdW5jdGlvbihjb25zdHJhaW50X3JhbmdlLCBjb25zdHJhaW50X2NvbHVtbnMsIC4uLil7CiAgIyBBIGZ1bmN0aW9uIHRvIHBsb3QgdGhlIG91dHB1dCBvZiBjb25zdHJhaW50X3Byb3AKICAKICBwYXIobWFyID0gYygxMiw0LDMsMiksbGFzID0gMikKCnBjb2wgPSByZXAoJ2JsYWNrJywgbmNvbChjb25zdHJhaW50X3JhbmdlKSkKcGNvbFtjb25zdHJhaW50X2NvbHVtbnNdIDwtICdyZWQnICMgcGxvdCB0aGUgb3V0cHV0cyB3aGVyZSB3ZSBoYXZlIHNwZWNpZmllZCB0aGUgY29uc3RyYWludHMgaW4gcmVkLgoKcGxvdCgxOm5jb2woY29uc3RyYWludF9yYW5nZSksY29uc3RyYWludF9yYW5nZVsyLF0sIHlsaW0gPSBjKDAsMSkgLCBheGVzID0gRkFMU0UsIHhsYWIgPSAnJywgeWxhYiA9ICdyYW5nZSBvZiBlbnNlbWJsZSAoZnJhY3Rpb24pJywgY29sID0gcGNvbCwgcGNoID0gMTksIC4uLikKcG9pbnRzKDE6bmNvbChjb25zdHJhaW50X3JhbmdlKSwgY29uc3RyYWludF9yYW5nZVsxLF0sIGNvbCA9IHBjb2wsIHBjaCA9IDE5KQpzZWdtZW50cyh4MCA9IDE6bmNvbChjb25zdHJhaW50X3JhbmdlKSwgeTAgPSBjb25zdHJhaW50X3JhbmdlWzEsXSwgeDEgPSAxOm5jb2woY29uc3RyYWludF9yYW5nZSksIHkxID0gY29uc3RyYWludF9yYW5nZVsyLF0sIGNvbCA9IHBjb2wsIGx3ZCA9MiApCgpheGlzKHNpZGUgPSAxLCBsYWJlbHMgPSBjb2xuYW1lcyhjb25zdHJhaW50X3JhbmdlKSwgYXQgPSAxOm5jb2woY29uc3RyYWludF9yYW5nZSkpCmF4aXMoMikKYWJsaW5lKGggPSBjKDAsMSksIGNvbCA9ICdyZWQnKQogIAp9CmBgYAoKQWxsIGNvbnN0cmFpbnRzIHRvZ2V0aGVyIHRha2UgdGhlIG5vcm1hbGl6ZWQgcmFuZ2Ugb2YgYWxsIHRoZSBvdXRwdXRzIHRvIGEgbGl0dGxlIHVuZGVyIGEgaGFsZiBvZiB0aGUgb3JpZ2luYWwgcmFuZ2UsIG9uIGF2ZXJhZ2UuIE9mIGNvdXJzZSwgZm91ciBvZiB0aGUgaW5wdXRzIGFyZSBjb25zdHJhaW5lZCBoZXJlLCB3aGljaCBoYXMgcXVpdGUgYSBsYXJnZSBpbXBhY3QuCmBgYHtyfQpZX2xldmVsMWFfbWVhbl9hd19ub3JtX3JuIDwtIGNvbnN0cmFpbnRfcHJvcChZID0gWV9sZXZlbDFhX21lYW4sIGNvbnN0cmFpbnRfaXggPSBhd19ib3VuZGFyeV9peCkKbWVhbl9jb25zdHJhaW50X2FsbCA8LSBtZWFuKFlfbGV2ZWwxYV9tZWFuX2F3X25vcm1fcm5bMiwgXSAtIFlfbGV2ZWwxYV9tZWFuX2F3X25vcm1fcm5bMSwgXSkKWV9jb25zdHJhaW50X3Bsb3QoWV9sZXZlbDFhX21lYW5fYXdfbm9ybV9ybixjb25zdHJhaW50X2NvbHVtbnMgPSBjKGMoMSwzLDQsNSkpLCBtYWluID0gcGFzdGUoJ21lYW4gY29uc3RyYWluZWQgcmFuZ2UgPScsIHJvdW5kKG1lYW5fY29uc3RyYWludF9hbGwsMykpKQpgYGAKCldlIGNhbiBzZWUgd2hhdCBpbXBhY3RzIHRoZSBjb25zdHJhaW50cyBoYXZlIGluZGl2aWR1YWxseQpgYGB7cn0KCm5icF9peCA8LSB3aGljaChZX2NvbnN0X2xldmVsMWFfc2NhbGVkWywnbmJwX2xuZF9zdW0nXSA+IC0xMCkKbnBwX2l4IDwtIHdoaWNoKFlfY29uc3RfbGV2ZWwxYV9zY2FsZWRbLCducHBfbmxpbV9sbmRfc3VtJ10gPiAzNSAmICBZX2NvbnN0X2xldmVsMWFfc2NhbGVkWywnbnBwX25saW1fbG5kX3N1bSddIDwgODAgKQpjU29pbF9peCA8LSB3aGljaChZX2NvbnN0X2xldmVsMWFfc2NhbGVkWywnY1NvaWxfbG5kX3N1bSddID4gNzUwICYgWV9jb25zdF9sZXZlbDFhX3NjYWxlZFssJ2NTb2lsX2xuZF9zdW0nXSA8IDMwMDApCmNWZWdfaXggPC0gd2hpY2goWV9jb25zdF9sZXZlbDFhX3NjYWxlZFssJ2NWZWdfbG5kX3N1bSddID4gMzAwICYgWV9jb25zdF9sZXZlbDFhX3NjYWxlZFssJ2NWZWdfbG5kX3N1bSddIDwgODAwKQoKYGBgCgpUaGUgTkJQIGNvbnN0cmFpbnQgaGFzIG5vIG1hcmdpbmFsIGltcGFjdApgYGB7cn0KCllfbGV2ZWwxYV9tZWFuX25icF9jb25zdCA8LSBjb25zdHJhaW50X3Byb3AoWSA9IFlfbGV2ZWwxYV9tZWFuLCBjb25zdHJhaW50X2l4ID0gbmJwX2l4ICkKbWVhbl9jb25zdHJhaW50X25icCA8LSBtZWFuKFlfbGV2ZWwxYV9tZWFuX25icF9jb25zdFsyLCBdIC0gWV9sZXZlbDFhX21lYW5fbmJwX2NvbnN0WzEsIF0pCllfY29uc3RyYWludF9wbG90KFlfbGV2ZWwxYV9tZWFuX25icF9jb25zdCwxLCAgbWFpbiA9IHBhc3RlKCdtZWFuIGNvbnN0cmFpbmVkIHJhbmdlID0nLCByb3VuZChtZWFuX2NvbnN0cmFpbnRfbmJwLDMpKSkKCmBgYAoKYGBge3J9CgpZX2xldmVsMWFfbWVhbl9ucHBfY29uc3QgPC0gY29uc3RyYWludF9wcm9wKFkgPSBZX2xldmVsMWFfbWVhbiwgY29uc3RyYWludF9peCA9IG5wcF9peCApCm1lYW5fY29uc3RyYWludF9ucHAgPC0gbWVhbihZX2xldmVsMWFfbWVhbl9ucHBfY29uc3RbMiwgXSAtIFlfbGV2ZWwxYV9tZWFuX25wcF9jb25zdFsxLCBdKQpZX2NvbnN0cmFpbnRfcGxvdChZX2xldmVsMWFfbWVhbl9ucHBfY29uc3QsMywgIG1haW4gPSBwYXN0ZSgnbWVhbiBjb25zdHJhaW5lZCByYW5nZSA9Jywgcm91bmQobWVhbl9jb25zdHJhaW50X25wcCwzKSkpCgpgYGAKCgpgYGB7cn0KCllfbGV2ZWwxYV9tZWFuX2NTb2lsX2NvbnN0IDwtIGNvbnN0cmFpbnRfcHJvcChZID0gWV9sZXZlbDFhX21lYW4sIGNvbnN0cmFpbnRfaXggPSBjU29pbF9peCApCm1lYW5fY29uc3RyYWludF9jU29pbCA8LSBtZWFuKFlfbGV2ZWwxYV9tZWFuX2NTb2lsX2NvbnN0WzIsIF0gLSBZX2xldmVsMWFfbWVhbl9jU29pbF9jb25zdFsxLCBdKQpZX2NvbnN0cmFpbnRfcGxvdChZX2xldmVsMWFfbWVhbl9jU29pbF9jb25zdCw0LCAgbWFpbiA9IHBhc3RlKCdtZWFuIGNvbnN0cmFpbmVkIHJhbmdlID0nLCByb3VuZChtZWFuX2NvbnN0cmFpbnRfY1NvaWwsMykpKQoKYGBgClZlZ2V0YXRpb24gY2FyYm9uIChjVmVnKSBoYXMgdGhlIHN0cm9uZ2VzdCBpbXBhY3Qgb24gZXZlcnl0aGluZyBlbHNlLiBUaGlzIGlzIG5vIHN1cHJpc2UsIGdpdmVuIHRoYXQgc28gZmV3IG9mIHRoZSBlbnNlbWJsZSBtZW1iZXJzIHNlZW0gdG8gc2ltdWxhdGUgY2FyYm9uIHZlZ2V0YXRpb24gaGlnaCBlbm91Z2guCmBgYHtyfQoKWV9sZXZlbDFhX21lYW5fY1ZlZ19jb25zdCA8LSBjb25zdHJhaW50X3Byb3AoWSA9IFlfbGV2ZWwxYV9tZWFuLCBjb25zdHJhaW50X2l4ID0gY1ZlZ19peCApCm1lYW5fY29uc3RyYWludF9jVmVnIDwtIG1lYW4oWV9sZXZlbDFhX21lYW5fY1ZlZ19jb25zdFsyLCBdIC0gWV9sZXZlbDFhX21lYW5fY1ZlZ19jb25zdFsxLCBdKQpZX2NvbnN0cmFpbnRfcGxvdChZX2xldmVsMWFfbWVhbl9jVmVnX2NvbnN0LDUsICBtYWluID0gcGFzdGUoJ21lYW4gY29uc3RyYWluZWQgcmFuZ2UgPScsIHJvdW5kKG1lYW5fY29uc3RyYWludF9jVmVnLDMpKSkKCmBgYAoKYGBge3J9CgojIHdpdGggMyBwcm9jZXNzZXJzLCB1c2luZyBmb3JlYWNoIHBhcmFsbGVsIHByb2Nlc3NpbmcgdGFrZXMgYXBwcm94aW1hdGVseSAxLzMgdGhlIHRpbWUgKGFyb3VuZCAyMCBzZWNvbmRzIHBlciBlbXVsYXRvcikgb2YgbG9vcGluZyB0aGUgZW11bGF0b3IgZml0dGluZyBkaXJlY3RseS4gSSdkIGhvcGUgdGhpcyB3b3VsZCBzY2FsZSB3aXRoIHByb2Nlc3NvciBudW1iZXJzIC0gaXQnbGwgYmUgd29ydGggdHJ5aW5nIG9uIFNQSUNFLgoKIyBzeXN0ZW0udGltZSh0ZXN0bG9vcF9wYXIgPC0gZGlyZWN0X3R3b1N0ZXBfZ2xtbmV0X3BhcmFsbGVsKFg9WF9sZXZlbDEsIFkgPSBZX2xldmVsMSkpCgpgYGAKCgojIyBXcml0aW5nIHJvYnVzdCwgcGFyYWxsZWxpc2VkLCBtdWx0aXN0YXJ0ICBlbXVsYXRvcnMKYGBge3J9CmRpcmVjdF90d29TdGVwX2dsbW5ldCA8LSBmdW5jdGlvbihYLCBZLCAuLi4pewogIAogIGQgPC0gbmNvbChZKQogIAogIG91dCA8LSB2ZWN0b3IobW9kZT0nbGlzdCcsIGxlbmd0aD1kKQogIAogIGZvcihpIGluIDE6ZCl7CiAgICAKICAgIHkgPC0gWVssaV0KICAgIAogICAgZW0gPC0gdHdvU3RlcF9nbG1uZXQoWD1YLCB5ID0geSwgLi4uKQogICAgb3V0W2ldIDwtIGVtCiAKICB9CiAgCiAgb3V0Cn0gCgoKYGBgCgoKIyBEaXJlY3QgdHdvU3RlcCBlbXVsYXRvciB1c2luZyBmb3JlYWNoCmBgYHtyfQoKbGlicmFyeShkb1BhcmFsbGVsKQpyZWdpc3RlckRvUGFyYWxsZWwoY29yZXMgPSBkZXRlY3RDb3JlcygpIC0gMSkKCmRpcmVjdF90d29TdGVwX2dsbW5ldF9wYXJhbGxlbCA8LSBmdW5jdGlvbihYLCBZLCAuLi4pewogIAogIGQgPC0gbmNvbChZKQogIAogIG91dCA8LSB2ZWN0b3IobW9kZT0nbGlzdCcsIGxlbmd0aD1kKQogIAogIGZvcmVhY2goaSA9IDE6ZCkgJWRvcGFyJSB7CiAgICAKICAgIHkgPC0gWVssaV0KICAgIAogICAgZW0gPC0gdHdvU3RlcF9nbG1uZXQoWD1YLCB5ID0geSwgLi4uKQogICAgb3V0W2ldIDwtIGVtCiAKICB9CiAgCiAgb3V0Cn0gCgpgYGAKCgoKYGBge3J9CgojIEkgYWN0dWFsbHkgd3JvdGUgY29kZSB0byBkbyB0aGlzIGNyZWF0ZUttRml0TGlzdCwgd2hpY2ggaXNuJ3QgcGFyYWxsZWwgYXQgdGhlIG1vbWVudC4KIyBNYXliZSBtYWtlIGl0IHBhcmFsbGVsIGluIHRoZSBuZXh0IHZlcnNpb24/CgpsaWJyYXJ5KGRvUGFyYWxsZWwpCnJlZ2lzdGVyRG9QYXJhbGxlbChjb3JlcyA9IGRldGVjdENvcmVzKCkgLSAxKQoKZGlyZWN0X3R3b1N0ZXBfZ2xtbmV0X3BhcmFsbGVsIDwtIGZ1bmN0aW9uKFgsIFksIC4uLil7CiAgCiAgZCA8LSBuY29sKFkpCiAgZm9yZWFjaChpID0gMTpkKSAlZG9wYXIlIHsKICAgIAogICAgeSA8LSBZWyxpXQogICAgCiAgICBlbSA8LSB0d29TdGVwX2dsbW5ldChYPVgsIHkgPSB5LCAuLi4pCiAgfQp9IAoKCgpgYGAKCgoKYGBge3J9CgpsaWJyYXJ5KGRvUGFyYWxsZWwpCmNvcmVzPWRldGVjdENvcmVzKCkKY2wgPC0gbWFrZUNsdXN0ZXIoY29yZXNbMV0tMSkgI25vdCB0byBvdmVybG9hZCB5b3VyIGNvbXB1dGVyCnJlZ2lzdGVyRG9QYXJhbGxlbChjbCkKCmZpdGxpc3RfdGVzdCA8LSBjcmVhdGVLbUZpdExpc3RQYXJhbGxlbChYID0gWF9sZXZlbDFhLCBZID0gIFlfY29uc3RfbGV2ZWwxYV9zY2FsZWQsIGZvcm11bGEgPSB+LiwgbXVsdGlzdGFydCA9IDQpCnN0b3BDbHVzdGVyKGNsKQoKYGBgCgpgYGB7ciwgZmlnLndpZHRoID0gNywgZmlnLmhlaWdodCA9IDl9CgoKcGxvdChmaXRsaXN0X3Rlc3RbWzRdXSkKYGBgCgoKYGBge3J9Cgojc3VtbWFyaXNlS21Mb28gPC0gZnVuY3Rpb24oZml0KXsKICAKIyAgbG9vIDwtIGxlYXZlT25lT3V0LmttKGZpdCwgdHlwZSA9ICdVSycsIHRyZW5kLnJlZXN0aW0gPSBUUlVFKQogIAojICBsb29fbWVhbiA8LSBtZWFuKGxvbyQpCiAgCiAgCiN9CgoKCmBgYAoKCgoKCmBgYHtyfQoKIyBzeXN0ZW0udGltZSh0ZXN0bG9vcCA8LSBkaXJlY3RfdHdvU3RlcF9nbG1uZXQoWD1YX2xldmVsMSwgWV9sZXZlbDEpKQoKYGBgCgoKCmBgYHtyfQojIFRlc3QgcGFyYWxsZWwgcHJvY2Vzc2luZyBhZ2FpbnN0IGEgZm9yZWFjaCBwcm9jZXNzaW5nIChhbmQgbWF5YmUgbWNsYXBwbHk/KQoKI3N5c3RlbS50aW1lKHRlc3Rsb29wX3BhciA8LSBkaXJlY3RfdHdvU3RlcF9nbG1uZXRfcGFyYWxsZWwoWD1YX2xldmVsMSwgWV9sZXZlbDEpKQoKCgpgYGAKCgpgYGB7cn0KZW1MaXN0IDwtIGZ1bmN0aW9uKFgsIFkpewogICMgQ3JlYXRlIGEgbGlzdCBvZiBvYmplY3RzIHRvIGJlIGVtdWxhdGVkCiAgIyBYICAgICAgICAgICAgIGRlc2lnbiBtYXRyaXggd2l0aCAobnJvdykgaW5zdGFuY2VzIG9mIChuY29sKSBpbnB1dHMKICAjIFkgICAgICAgICAgICAgbWF0cml4IG9mIG91dHB1dHMsIHdpdGggb25lIHJvdwogICMgICAgICAgICAgICAgICBmb3IgZWFjaCByb3cgb2YgWAoKICBkIDwtIG5jb2woWSkKICBlbV9saXN0IDwtIHZlY3Rvcihtb2RlPSdsaXN0JywgbGVuZ3RoPWQpCgogIGZvcihpIGluIDE6ZCl7CiAgICBlbV9vYmogPC0gTlVMTAogICAgZW1fb2JqJFggPC0gWAogICAgZW1fb2JqJHkgPC0gWVssIGldCiAgICBlbV9saXN0W1tpXV0gPC0gZW1fb2JqCiAgfQogIGVtX2xpc3QKfQpgYGAKCmBgYHtyfQoKCiN0ZXN0IDwtIGVtbGlzdChYX2xldmVsMSwgWV9sZXZlbDEpCgoKYGBgCgpgYGB7cn0KCiNtY2xhcHBseShYID0gdGVzdCwgRlVOID0ga20pCgoKYGBgCgoKCmBgYHtyfQoKIyBmdW5jdGlvbiBmcm9tIGhkZSBmb3IgZGlyZWN0IHByZWRpY3Rpb24KZGlyZWN0LnByZWQgPSBmdW5jdGlvbiAoZm9ybSwgWCwgWSwgWG5ldywgLi4uKXsKICAjIERpcmVjdGx5IGFwcGxpZXMga20gaW4gcGFyYWxsZWwgdG8gcHJlZGljdCBlYWNoIGNvbHVtbiBvZiBhbiBlbnNlbWJsZQogIGVucy5saXN0ID0gZW1saXN0KFggPSBYLCBZID0gWSkKICBrbS5saXN0ID0gbWNsYXBwbHkoZW5zLmxpc3QsIEZVTiA9IGttLndyYXAsIGZvcm0gPSBmb3JtKQoKICBwcmVkLmxpc3QgPSBtY2xhcHBseShrbS5saXN0LCBGVU4gPSBrbS5wcmVkLndyYXAsIFhuZXcgPSBhcy5tYXRyaXgoWG5ldywgbnJvdyA9IDEpLCB0eXBlID0gIlVLIikKCiAgb3V0Lm1lYW4gPSBzYXBwbHkocHJlZC5saXN0LCBGVU49ZXh0cmFjdC5wcmVkbWVhbikKICBvdXQuc2QgPSBzYXBwbHkocHJlZC5saXN0LCBGVU49ZXh0cmFjdC5wcmVkc2QpCiAgcmV0dXJuKGxpc3QobWVhbiA9IG91dC5tZWFuLCBzZCA9IG91dC5zZCkpCn0KCgoKYGBgCgoKCgoKCgo=